Работа с табличной частью документа 1С

Для того, чтобы учитывать деньги и товары, в бизнесе широко используют разные таблицы. Почти каждый документ – это таблица.

В одной таблице перечислены товары к отгрузке со склада. В другой таблице – обязательства по оплате этих товаров.

Поэтому в 1С видное место занимает работа с таблицами.

Таблицы в 1С также называют «табличные части». Они есть у справочников, документов и других .

Запрос в результате своего выполнения возвращает таблицу, доступ к которой возможно получить двумя разными способами.

Первый – более быстрый – выборка, получение строк из нее возможен только по порядку. Второй – выгрузка результата запроса в таблицу значений и далее произвольный доступ к ней.

//Вариант 1 – последовательный доступ к результатам запроса
//получение таблицы
Выборка = Запрос.Выполнить().Выбрать();
//по порядку обходим все строки результата запроса
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

//Вариант 2 – выгрузка в таблицу значений
Запрос = Новый Запрос(«ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура»);
//получение таблицы
Таблица = Запрос.Выполнить().Выгрузить().
//далее можем также обойти все строки
Для каждого Строка из Таблица Цикл
Сообщить(Строка.Наименование);
КонецЦикла;
//или произвольно обращаться к строкам
Строка = Таблица.Найти(«Лопата», «Наименование»);

Важная особенность – в таблице, которая получена из результата запроса, все колонки будут строго типизированы. Это значит, что запросив поле Наименование из справочника Номенклатура, Вы получите колонку вида Строка с допустимой длиной не более N символов.

Таблица на форме (толстый клиент)

Пользователь работает с таблицей, когда она размещена на форме.

Базовые принципы работы с формами мы с Вами обсуждали в уроке по и в уроке по

Итак, разместим таблицу на форме. Для этого можно перетащить таблицу с панели элементов управления. Аналогично можно выбрать в меню Форма/Вставить элемент управления.

Данные могут храниться в конфигурации – тогда нужно выбрать существующую (ранее добавленную) табличную часть того объекта конфигурации, форму которого Вы редактируете.

Нажмите кнопку «…» в свойстве Данные. Для того, чтобы увидеть список табличных частей, нужно раскрыть ветку Объект.

При выборе табличной части 1С сама добавит колонки у таблицы на форме. Строки введенные пользователем в такую таблицу будут сохраняться автоматически вместе со справочником/документом.

В этом же свойстве Данные Вы можете ввести произвольное имя и выбрать тип ТаблицаЗначений.

Это значит, что выбрана произвольная таблица значений. Она не добавит автоматически колонки, не будет автоматически сохраняться, но и делать с ней можно все, что угодно.

Нажав правой кнопкой на таблице Вы можете добавить колонку. В свойствах колонки можно указать его имя (для обращения в коде 1С), заголовок колонки на форме, связь с реквизитом табличной части (последнее – если выбрана не произвольная таблица, а табличная часть).

В свойствах таблицы на форме Вы можете указать – доступно ли пользователю добавлять/удалять строки. Более продвинутая форма – галочка ТолькоПросмотр. Эти свойства удобно использовать для организации таблиц предназначенных для вывода информации, но не редактирования.

Чтобы управлять таблицей, нужно вывести на форму командную панель. Выберите пункт меню Форма/Вставить элемент управления/Командная панель.

В свойствах командной панели выберите галочку Автозаполнение, чтобы кнопки на панели появились автоматически.

Таблица на форме (тонкий/управляемый клиент)

На управляемой форме указанные действия выглядят немного по другому. Если Вам нужно разместить на форме табличную часть – раскройте ветку Объект и перетащите одну из табличных частей влево. И все!

Если нужно разместить таблицу значений, добавьте новый реквизит формы и в его свойствах укажите тип – таблица значений.

Чтобы добавить колонки, используйте меню по правой кнопке мыши на этом реквизите формы, пункт Добавить колонку реквизита.

После чего также перетащите таблицу влево.

Чтобы у таблицы появилась командная панель, в свойствах таблицы выберите значения в секции Использование – Положение командной панели.

Выгрузка таблицы в Excel

Любую таблицу 1С, расположенную на форме, можно распечатать или выгрузить в Excel.

Для этого щелкните правой кнопкой мыши на свободном месте в таблице и выберите пункт Вывести список.

В управляемом (тонком) клиент аналогичные действия можно выполнить с помощью пункта меню Все действия/Вывести список.

В рамках данной статьи мы напишем обработку заполнения табличной части в 1С 8.3 для типовой конфигурации 1С:ERP 2.1. Предположим, что целью поставленной задачи стоит установка ручной скидки в размере 5% для всех номенклатурных позиций данного документа. Пример из статьи можно скачать по или другой аналогичной обработки по .

Данная инструкция предназначена для управляемых форм (8.2 и 8.3). Для обычных форм (8.1, 8.2) можно воспользоваться .

Создайте и сохраните на ваш компьютер новую обработку. Сначала необходимо произвести некоторые регистрационные действия.

Откройте модуль объекта и пропишите код, приведенный ниже (его также можно взять из данной выше обработки). В целом, структура не будет меняться в зависимости от ситуации. Редактируются только некоторые параметры настроек, а так же при необходимости имена переменных.

В рамках данной статьи мы не будем подробно останавливаться на регистрации внешних обработок и печатных форм в 1С. Вся эта информация есть в других наших статьях.

Заполнение табличной части документа

Создадим новую форму обработки.

Теперь нам необходимо добавить на созданной форме новую команду. Предполагается, что она будет автоматически менять данные в табличной части как одного, так и нескольких документов (их формы списка) одновременно, записывая их впоследствии.

В рамках нашего примера будет произведена обработка уже существующей табличной части «Товары». Для каждой строки будет установлена ручная скидка в размере 5%. Так же, мы рассчитаем саму сумму данной скидки, равную сумме товаров в строке, умноженных на 0,05.

&НаСервереПроцедура ВыполнитьКоманду(Команда, ОбъектыНазначения) Для каждого ЗаказКлиента из ОбъектыНазначения Цикл ЗаказКлиентаОбъект = ЗаказКлиента.ПолучитьОбъект(); Для каждого СтрокаТЗ из ЗаказКлиентаОбъект.Товары Цикл СтрокаТЗ.ПроцентРучнойСкидки = 5; СтрокаТЗ.СуммаРучнойСкидки = СтрокаТЗ.Сумма * 0.05; КонецЦикла; ЗаказКлиентаОбъект.Записать(); КонецЦикла;КонецПроцедуры

Регистрация внешней обработки

Запустите 1С в режиме «Предприятие» и откройте справочник «Дополнительные отчеты и обработки». Найдем его через меню «Все функции».

Создайте новый элемент в открывшемся справочнике и по одноименной кнопке загрузите из файла свою обработку. Разместим ее одновременно и на форме списка и на форме самой карточки документа.

Теперь в форме списка документов «Заказ клиента» появится кнопку «Заполнение…», которая позволит произвести изменить ручные скидки товаров сразу у нескольких документов.

Так же данная кнопка будет доступна и в карточке самого документа.

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Длякаждого Строка из ТабличнаяЧасть Цикл

Сообщить(Строка.РеквизитТабличнойЧасти);

КонецЦикла;

На каждой итерации в переменную Строкапередается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

Как получить и обойти выделенные строки табличной части

Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.

Для получения перечня выделенных строк используется следующий код:

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Длякаждого Строка из ВыделенныеСтроки Цикл

//содержимое цикла

КонецЦикла;

Как программно выделить строки табличной части (табличного поля) и снять выделение

Чтобы программно снять выделение строк табличного поля:

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

Чтобы программно выделить все строки табличного поля:

Длякаждого ТекущаяСтрока ИзТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока.Реквизит1=»Значение»;

Как программно заполнить реквизиты строки табличной части

Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока— булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь,если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

ПроцедураТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры

ИмяПараметровПечати, КлючПараметровПечати

Если Вы сталкивались с данным свойством Табличного документа, то думаю заметили, что не совсем очевидно как оно устанавливается и где хранится. В этой статье я расскажу об этом.

ИмяПараметровПечати и КлючПараметровПечати — это по сути одно свойство, просто ИмяПараметровПечати использовалось в 8.1 и осталось для совместимости, а КлючПараметровПечати это название для платформы 8.2.

В этой статье я буду использовать свойство ИмяПараметровПечати как более привычное, но все что здесь написано справедливо и для КлючПараметровПечати.

Как происходит сохранение параметров печати?

Рассмотрим простой отрывок кода (листинг):

ТабДок = Новый ТабличныйДокумент;
ТабДок.ПолеСверху = 5;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Реализация_Печать";

В нём мы создали табличный документ и установили свойство «ПолеСверху» равное 5. Далее мы указали для свойства «ИмяПараметровПечати» значение «ПАРАМЕТРЫ_ПЕЧАТИ_Реализация_Печать», эта текстовая строка является ключом в хранилище настроек(об этом позже). Выполняя этот код программа посмотрит существует ли для этого табличного документа и этого пользователя настройка печати, если нет то запишет, а если есть, то параметры будут взяты уже из сохраненной.

Как изменить параметры печати?

Параметры печати можно изменить только в пользовательском режиме открыв окно «Параметры страницы»

Параметры страницы (для ИмяПараметровСтраницы)

Здесь Вы видите параметры которые сохраняются для печати здесь же их можно изменить, после изменения нужно нажать «ОК».

Программно изменить уже существующую настройку нельзя, т.к. она хранится в виде объекта с которым 1С не умеет работать «НеизвестныйОбъект». Чтобы установить свои параметры нужно удалить существующую настройку и тогда при печати запишутся те параметры которые Вы указали выше установки свойства «ИмяПараметровПечати». В моем примере сохранится только отступ сверху 5 мм. При этом остальные параметры могут оказаться не пустыми, а заполненными по умолчанию.

Как удалить параметры печати?

Настройка сохраняется в системном Хранилище настроек и чтобы её удалить нужно, вызвать метод «Удалить» указав «Ключ объекта» и «Имя пользователя». Если пользователя не указать, то эта настройка удалиться для всех пользователей. При указании Ключа объекта есть особенность это не просто строка которую Вы указали при создании табличного документа, а дополненная в начале следующим:

«Общее/НастройкиПечатиТабличногоДокумента»

В моем случае чтобы удалить настройку нужно написать следующее:

КлючОбъекта = "Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_Реализация_Печать";
ИмяПользователя = "Администратор";
ХранилищеСистемныхНастроек.удалить(КлючОбъекта,,ИмяПользователя);

Обратите внимание! ИмяПользователя это строка, а не объект Пользователь.

В этой статье научимся работать с областями табличного документа в 1С 8.3. Вы узнаете, как создать и вывести вертикальные области, как создать и вывести горизонтальные области, а также как работать с пересечением областей.

Создадим обработку 1С, в которой будем разрабатывать макеты для демонстрации работы с разными областями табличных документов 1С.

И начнем с вертикальных областей.

Вертикальные области табличного документа 1С 8.3

Выполним небольшую задачу: будем выводить в табличном документе пронумерованные колонки, количество которых задается с формы.

Для реализации, создадим у обработки макет табличного документа, который так и назовем «ВертикальныеОбласти».

Макет обработки 1С

Нам нужно создать вертикальную область в этом макете. Для этого выделим те колонки макета табличного документа, в которых мы хотим создать область, и выполним команду «Назначить имя», которая находится по пути «Главное меню – Таблица – Имена».

Колонки табличного документа 1С

В открывшемся окне введем имя области.

Имя области табличного документа 1С

После того, как мы зададим имя, на макете будет создана область: в поле сверху появится название области, а также отобразятся вертикальные полосы, которые будут эту область ограничивать.

Вертикальная область табличного документа 1С

Немного доработаем макет. Объединим ячейки во второй строке. Для этого необходимо их выделить, вызвать контекстное меню, и применить команду «Объединить» этого меню.

Объединение ячеек макета 1С

В объединенных ячейках установим в свойство Заполнение значение Параметр. У нас в этих ячейках будет выходить какой-то параметр, назовем его НомерКолонки, а также в свойство Горизонтальное положение установим значение Центр.

Свойство ячеек макета 1С

И увеличим размер шрифта.

Шрифт текста в ячейке макета 1С

Всё, с макетом мы закончили.

Следующим шагом, разработаем основную форму обработки. На этой управляемой форме создадим реквизит «Количество колонок» (тип целое и неотрицательно число), а также команду формы «Вывести вертикальные области».

Управляемая форма обработки 1С

У команды формы создадим клиентский обработчик, который будет вызывать серверную бесконтекстную функцию.

&НаСервереБезКонтекстаФункция ПолучитьТабличныйДокументВертикальныеОбласти(КоличествоОбластей)ТабличныйДокумент = Новый ТабличныйДокумент; Возврат ТабличныйДокумент;КонецФункции // ПолучитьТабличныйДокументВертикальныеОбласти() &НаКлиентеПроцедура ВывестиВертикальныеОбласти(Команда)Если КоличествоКолонок = 0 Тогда Возврат;КонецЕсли;ТабДок = ПолучитьТабличныйДокументВертикальныеОбласти(КоличествоКолонок);ТабДок.Показать("Вертикальные области");КонецПроцедуры

В функции ПолучитьТабличныйДокументВертикальныеОбласти мы получим макет обработки, получим область макета «Колонка», создадим простой цикл от 1 до значения реквизита формы количество колонок, а потом в теле цикла будет в табличном документе присоединять область при помощи метода Присоединить(), который добавляет ячейки области по горизонтали, как бы присоединяя их.

&НаСервереБезКонтекстаФункция ПолучитьТабличныйДокументВертикальныеОбласти(КоличествоОбластей)ТабличныйДокумент = Новый ТабличныйДокумент;Макет = Обработки.ПримерТабличныхДокументов.ПолучитьМакет("ВертикальныеОбласти");ВертикальнаяОбласть = Макет.ПолучитьОбласть("Колонка");Для н = 1 по КоличествоОбластей Цикл ВертикальнаяОбласть.Параметры.НомерКолонки = "Колонка №" + Строка(н); ТабличныйДокумент.Присоединить(ВертикальнаяОбласть);КонецЦикла; Возврат ТабличныйДокумент;КонецФункции // ПолучитьТабличныйДокументВертикальныеОбласти()

И у нашей обработки будет следующий результат работы.

Вертикальные области табличного документа 1С

Горизонтальные области табличного документа 1С 8.3

В этой задаче будем выводить в табличном документе пронумерованные строки. Для этого создадим макет обработки, который назовем «Горизонтальные области». В этом макете выделим строки, и выполним уже знакомую команду «Назначить имя» («Главное меню – Таблица – Имена»).

Горизонтальные области табличного документа 1С

В результате выполнения команды, выйдет окно, где нужно ввести название области, после того, как введем название области, макет табличного документа изменится: в поле слева появится название области, а также отобразятся горизонтальные полосы, которые будут эту область ограничивать.

Горизонтальные области табличного документа 1С

Также как и с предыдущим макетом (вертикальные области), объединим ячейки, сделаем их параметром, увеличим шрифт и выполним центрирование.

Ячейки табличного документа 1С

На основной форме обработки создадим новый реквизит КоличествоКолонок (тип Число) и команду ВывестиГоризонтальныеОбласти.

Управляемая форма обработки 1С

Далее, мы создаем обработчик события команды формы и функцию, которая возвращает табличный документ с горизонтальными областями. В этом коде будет все точно также, как и в коде, который формировал табличный документ с вертикальными областями, но только вместо метода Присоединить будет использоваться метод Вывести, который добавляет ячейки области по вертикали.

&НаСервереБезКонтекстаФункция ПолучитьТабличныйДокументГоризонтальныеОбласти(КоличествоОбластей)ТабличныйДокумент = Новый ТабличныйДокумент;Макет = Обработки.ПримерТабличныхДокументов.ПолучитьМакет("ГоризонтальныеОбласти");ГоризонтальнаяОбласть = Макет.ПолучитьОбласть("Строки");Для н = 1 по КоличествоОбластей Цикл ГоризонтальнаяОбласть.Параметры.НомерСтроки = "Строка №" + Строка(н); ТабличныйДокумент.Вывести(ГоризонтальнаяОбласть);КонецЦикла; Возврат ТабличныйДокумент;КонецФункции // ПолучитьТабличныйДокументГоризонтальныеОбласти() &НаКлиентеПроцедура ВывестиГоризонтальныеОбласти(Команда)Если КоличествоСтрок = 0 Тогда Возврат;КонецЕсли;ТабДок = ПолучитьТабличныйДокументГоризонтальныеОбласти(КоличествоСтрок);ТабДок.Показать("Горизонтальные области");КонецПроцедуры 

И результат работы этого кода.

Горизонтальные области табличного документа 1С

Таким образом. Метод Присоединить табличного документа добавляет области по горизонтали таблицы, а метод Вывести – по вертикали.

Научимся выводить таблицу.

Пересечение областей табличного документа 1С 8.3

Сделаем возможность вывода таблицы с определенным количеством строк и колонок, которое будет задаваться из реквизитов формы, созданных ранее.

Для этого создадим новый макет табличного документа, с пересекающимися вертикальными и горизонтальными областями.

Пересечение областей табличного документа 1С

В пересечении областей объединим ячейки, зададим параметр, отцентрируем, а также обведем объединенную ячейку.

Пересечение областей табличного документа 1С

На форме обработки создадим команду ВывестиТаблицу.

Команда формы обработки 1С

Создадим обработчик команды и функцию, которая будет формировать таблицу.

&НаСервереБезКонтекстаФункция ПолучитьТабличныйДокументТаблицу(КоличествоКолонок, КоличествоСтрок)ТабличныйДокумент = Новый ТабличныйДокумент;Макет = Обработки.ПримерТабличныхДокументов.ПолучитьМакет("ПересечениеОбластей");ОбластиЯчейки = Макет.ПолучитьОбласть("Строки|Колонки");Для н = 1 по КоличествоСтрок Цикл ОбластиЯчейки.Параметры.Область = Строка(н) + ".1";ТабличныйДокумент.Вывести(ОбластиЯчейки);Для к = 2 по КоличествоКолонок Цикл ОбластиЯчейки.Параметры.Область = Строка(н) + "." + Строка(к);ТабличныйДокумент.Присоединить(ОбластиЯчейки);КонецЦикла;КонецЦикла; Возврат ТабличныйДокумент;КонецФункции &НаКлиентеПроцедура ВвестиТаблицу(Команда)Если КоличествоСтрок = 0 или КоличествоКолонок = 0 Тогда Возврат;КонецЕсли;ТабДок = ПолучитьТабличныйДокументТаблицу(КоличествоКолонок, КоличествоСтрок);ТабДок.Показать("Таблица");КонецПроцедуры

Пересечение областей на табличной документе задается таким способом: «Строки|Колонки». Пишем название одной области, вертикальную черту и название другой области, которая с ней пересекается. Так мы получим именно пересечение областей, с которым дальше и будем работать: выводить и присоединять.

В этой функции делаем два цикла. В первом цикле обходим и создаем строки. Первую ячейку строки (она же первая ячейка колонки) мы выводим в табличный документ методом Вывести, а потом начинаем делать цикл по колонкам и уже присоединяем области по горизонтали, с помощью метода Присоединить. Когда колонки заканчиваются мы выходим из цикла по колонками и начинаем следующую итерацию цикла по строкам, выводя опять новую ячейку ниже по таблице с помощью метода Вывести. И так далее.

В этот раз у нас будет следующий результат.

Пересечение областей табличного документа 1С

Видео ниже почти повторяет статью, но в нем есть БОНУС. В конце видео я показываю, как добавить в таблицу вывод шапки и боковика, а также вывожу табличный документ на управляемой форме 1С.

Области табличного документа 1С

Смотрите в этом видео:

Другие статьи про табличные документы в 1С:

Создание макета табличного документа в 1С 8.3

Табличный документ на управляемой форме 1С 8.3

Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog

Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.

можно оплатить вручную:

Добавить комментарий