Содержание

2.37 Документ НарядНаСборку.

Этим документом мы будем запускать в производство очередную партию комплектующих. В наряде будет указано с какого склада брать заготовки, кто из работников будет заниматься сборкой и, главное, какие изделия и в каком количестве должны быть сделаны. Количество и ассортимент комплектующих мы будем определять по справочнику Комплектация.
Проводка документа (Д 20 – К 10.2). Документ должен будет списать со склада некоторое количество комплектующих, при этом списание должно идти по методу FIFO, в первую очередь из более ранних накладных.
Документ будет помещен в специальный журнал.
Идентификатор: НарядНаСборку
Журнал: НарядыНаСборку
Нумератор: Нет       Периодичность: Год
Длина: 5         Тип: число
Уникальность: да       Автонумерация: да
Может являться основанием для документа любого вида?: нет
Проводить: да
Автоматическое удаление движений: да
Автоматическая нумерация строк: да
Бухгалтерский учет: да
Расчет: нет
Оперативный учет: нет
Создавать операцию: Всегда     Редактировать операцию: нет

Является основанием для

Вводится на основании

Шапка

Реквизит Описание ТипЗначения

Доп.

Склад   С.Склады  
Сборщик   С.Сотрудники  

Таблица

Реквизит Описание ТипЗначения

Доп.

Изделие   С.Изделия  
Кол   Число 5.0 +
В журнал добавим графу "Сборщик". Создаем форму документа.
Поля Валюта, ДатаКурса, Курс удаляем. Поле АвторДокумента делаем недоступным. Добавляем кнопку [Заявка] с формулой Заявка(), по этой кнопке мы будем распечатывать перечень входящих в изделия комплектующих, с указанием общего количества.
В табличную часть добавим поле текст с функцией Ост(Склад,Изделие), эта колонка будет показывать, для какого количества изделий хватит комплектующих (но, эта функция будет показывать только возможное количество, она, разумеется, не учитывает возможность участия комплектующего в разных изделиях). В поле табличной части Кол добавляем процедуру Кол(), эта процедура будет проверять, не превышает ли указанное количество изделий возможное, исходя из запасов на складе. Еще раз подобную проверку мы будем делать в модуле проведения.

В модуле формы документа пишем:
Процедура ВводНового()
  АвторДокумента=СокрЛП(ИмяПользователя());
  ФирмаДокумента=Константа.ОснФирма;
  Валюта=Константа.ОснВалюта;
  ДатаКурса=ДатаДок;
  Курс=1;
КонецПроцедуры
//==========================================================
Процедура ПриОткрытии()
  ПриЗаписиПерепроводить(1);
КонецПроцедуры
//==========================================================
Процедура Заявка()
// Печать спецификации
  ТабЗн=СоздатьОбъект("ТаблицаЗначений");
  ТабЗн.НоваяКолонка("Ком","Справочник.Комплектующие");
  ТабЗн.НоваяКолонка("Кол","Число",12,0);
  СпрКом=СоздатьОбъект("Справочник.Комплектация");
// Подчиненный справочнику Изделия справочник Комплектация
  ВыбратьСтроки();
// Обходим строки документа
  Пока ПолучитьСтроку()=1 Цикл
    СпрКом.ИспользоватьВладельца(Изделие);
// Выбираем комплектующие по изделию
    СпрКом.ВыбратьЭлементы();
// Обходим справочник с составом комплектов
    Пока СпрКом.ПолучитьЭлемент()=1 Цикл
      ТабЗн.НоваяСтрока();
      ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;
// Это мы определили, что входит в комплект
      ТабЗн.Кол=Кол;
// И сколько
    КонецЦикла;
    СпрКом.ИспользоватьВладельца("");
  КонецЦикла;
  СпрКом="";
  Таб=СоздатьОбъект("Таблица");
  Таб.ИсходнаяТаблица("");
  Таб.ВывестиСекцию("Шапка");
  ТабЗн.Свернуть("1","2");
// Суммируем строки с одинаковыми комплектующими
  ТабЗн.Сортировать("1");
  ТабЗн.ВыбратьСтроки();
  Стр=1;
  Пока ТабЗн.ПолучитьСтроку()=1 Цикл
    Комп=ТабЗн.Ком;
    НазвРодителя=СокрЛП(Комп.Родитель.Наименование);
    Поз1=Найти(НазвРодителя,"(");
    Поз2=Найти(НазвРодителя,")");
    ГОСТ=Сред(НазвРодителя,Поз1+1,Поз2-Поз1-1);
    Ком=СокрЛП(Комп.Наименование)+" "+ГОСТ;
    Колич=ТабЗн.Кол;
    Таб.ВывестиСекцию("Строка");
    Стр=Стр+1;
  КонецЦикла;
  Таб.ТолькоПросмотр(1);
  Таб.ПараметрыСтраницы(1,100,1);
  Таб.Показать("");
КонецПроцедуры
//==========================================================
Функция Ост(Скл,Изд)
// Функция с двумя параметрами на входе: Склад и Изделие
  СпЗн=СоздатьОбъект("СписокЗначений");
  СпрКом=СоздатьОбъект("Справочник.Комплектация");
  БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
  БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
  БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
  СпрКом.ИспользоватьВладельца(Изд);
  СпрКом.ВыбратьЭлементы();
// Обходим все комплектующие, входящие в изделие
  Пока СпрКом.ПолучитьЭлемент()=1 Цикл
    СКом=СпрКом.ТекущийЭлемент();
    Ком=СКом.Комплектующее;
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Скл,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
// Отбираем по указанному складу и текущей комплектующей
    БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
    КолКом=БухИтоги.СКД(3);
// Выясняем, сколько штук этих комплектующих еще есть на складе
    СпЗн.ДобавитьЗначение(КолКом);
// Добавляем в список
  КонецЦикла;
  СпрКом="";
  ИОст=0;
// Ищем минимальное значение в списке
  Для ЧЦ=1 По СпЗн.РазмерСписка() Цикл
    ТТТ="";
    Если ЧЦ=1 Тогда
      КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);
      ИОст=КолСп;
    Иначе
      КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);
      Если ИОст>КолСп Тогда
        ИОст=КолСп;
      КонецЕсли;
    КонецЕсли;
  КонецЦикла;
  Возврат(ИОст);
// Выдаем это минимальное значение
КонецФункции
//==========================================================
Процедура Кол()
  ОстКомпл=Ост(Склад,Изделие);
// Выясняем остаток на складе
  Если Кол>ОстКомпл Тогда
// Если запросили больше
    Кол=ОстКомпл;
// Даем сколько есть
  КонецЕсли;
КонецПроцедуры
Теперь пропишем процедуру проведения. Здесь у нас будет формирование движения партий, но не по строкам документа, а по комплектующим, определяемым через эти строки. Проводки будут только одного типа (Д 20 – К 10.2). Здесь же будет проверка, не запрашиваем ли мы комплектующих больше, чем есть на складе.
Процедура ОбработкаПроведения()
  Если Склад.Выбран()=0 Тогда
    Сообщить("Документ Наряд на сборку №"+НомерДок+"
    |от "+ДатаДок+" не проведен.
    |Не выбран склад заготовок");
    НеПроводитьДокумент();
    Возврат;
  КонецЕсли;
  Если Сборщик.Выбран()=0 Тогда
    Сообщить("Документ Наряд на сборку №"+НомерДок+"
    |от "+ДатаДок+" не проведен.
    |Не указан сборщик");
    НеПроводитьДокумент();
    Возврат;
  КонецЕсли;
// Это были обычные проверки
  ТабЗн=СоздатьОбъект("ТаблицаЗначений");
  ТабЗн.НоваяКолонка("Ком","Справочник.Комплектующие");
  ТабЗн.НоваяКолонка("Кол","Число",12,0);
  СпрКом=СоздатьОбъект("Справочник.Комплектация");
  ВыбратьСтроки();
  Пока ПолучитьСтроку()=1 Цикл
    СпрКом.ИспользоватьВладельца(Изделие);
    СпрКом.ВыбратьЭлементы();
    Пока СпрКом.ПолучитьЭлемент()=1 Цикл
      ТабЗн.НоваяСтрока();
      ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;
      ТабЗн.Кол=Кол;
    КонецЦикла;
    СпрКом.ИспользоватьВладельца("");
  КонецЦикла;
  БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
  БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
  БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
  ФлагОтказа=0;
  ТабЗн.Свернуть("1","2");
  ТабЗн.ВыбратьСтроки();
  Пока ТабЗн.ПолучитьСтроку()=1 Цикл
    Ком=ТабЗн.Ком;
    Колич=ТабЗн.Кол;
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
    БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
    КолКом=БухИтоги.СКД(3);
    Если Колич>КолКом Тогда
      ФлагОтказа=1;
      Сообщить(Строка(Ком));
    КонецЕсли;
  КонецЦикла;
// Если посмотреть модуль документа, это похоже на процедуру Заявка()
  Если ФлагОтказа=1 Тогда
    Сообщить("Документ Наряд на сборку №"+НомерДок+"
    |от "+ДатаДок+" не проведен.
    |Заказ по вышеперечисленным позициям
    |превышает остаток на складе");
    НеПроводитьДокумент();
    Возврат;
  КонецЕсли;
// Отказ от проведения по причине нехватки комплектующих
  ТабЗн.УдалитьСтроки();
  ТабЗн="";
  ТабПар=СоздатьОбъект("ТаблицаЗначений");
  ТабПар.НоваяКолонка("Док","Документ.ПриходнаяНакладная");
  ТабПар.НоваяКолонка("Кол","Число",10,0);
  ТабПар.НоваяКолонка("Сум","Число",14,2);
  СуммаОпер=0;
  ВыбратьСтроки();
  Пока ПолучитьСтроку()=1 Цикл // По Изделию
// Обходим строки
    НС=НомерСтроки;
    Изд=Изделие;
    СпрКом.ИспользоватьВладельца(Изделие);
    СпрКом.ВыбратьЭлементы();
    Пока СпрКом.ПолучитьЭлемент()=1 Цикл // По Комплектующей
// Обходим комплектующие
      Колич=Кол;
      Ком=СпрКом.ТекущийЭлемент().Комплектующее;
      БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
      БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
      БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);
      БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
      ТабПар.УдалитьСтроки();
      БухИтоги.ВыбратьСубконто(3);
// Выбираем только третье!!! субконто
      Пока БухИтоги.ПолучитьСубконто(3)=1 Цикл
// Определяем партии
        ДокП=БухИтоги.Субконто(3);
        КолП=БухИтоги.СКД(3);
        СумП=БухИтоги.СКД(1);
        ТабПар.НоваяСтрока();
        ТабПар.Док=ДокП;
        ТабПар.Кол=КолП;
        ТабПар.Сум=СумП;
      КонецЦикла;
      ТабПар.Сортировать("1+");
      ТабПар.ВыбратьСтроки();
      Пока ТабПар.ПолучитьСтроку()=1 Цикл // По Партии
// Обходим партии
        ДокП=ТабПар.Док;
        КолП=ТабПар.Кол;
        СумП=ТабПар.Сум;
        Если Колич>КолП Тогда
          ПривязыватьСтроку(НС);
          Операция.НоваяПроводка();
          Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
          Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
          Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
          Операция.Дебет.Изделие = Изделие;
          Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();
          Операция.Кредит.МестоХранения = Склад;
          Операция.Кредит.Комплектующее = Ком;
          Операция.Кредит.ПриходнаяНакладная = ДокП;
          Операция.Фирма = ФирмаДокумента;
          Операция.Комментарий = "Передача комплектующих на сборку";
          Операция.НомерЖурнала = "10";
          Операция.Сумма = СумП;
          Операция.Количество = КолП;
          Колич=Колич-КолП;
          СуммаОпер=СуммаОпер+СумП;
// Накапливаем сумму операции по каждой проводке
        Иначе
          СумО=Окр(Колич*(СумП/КолП),2,1);
// Определяем сумму остатка через цену партии
          ПривязыватьСтроку(НС);
          Операция.НоваяПроводка();
          Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
          Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
          Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
          Операция.Дебет.Изделие = Изделие;
          Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();
          Операция.Кредит.МестоХранения = Склад;
          Операция.Кредит.Комплектующее = Ком;
          Операция.Кредит.ПриходнаяНакладная = ДокП;
          Операция.Фирма = ФирмаДокумента;
          Операция.Комментарий = "Передача комплектующих на сборку";
          Операция.НомерЖурнала = "10";
          Операция.Сумма = СумО;
          Операция.Количество = Колич;
          СуммаОпер=СуммаОпер+СумО;
// Накапливаем сумму операции по каждой проводке
          Прервать;
// Все кончилось, больше партии по этому комплектующему обходить незачем
        КонецЕсли;
      КонецЦикла; // По Партии
    КонецЦикла; // По Комплектующей
  КонецЦикла; // По Изделию
  Операция.Содержание = "Запуск производства";
  Операция.СуммаОперации = СуммаОпер;
  Операция.Автор = АвторДокумента;
  Операция.Записать();
КонецПроцедуры
Вроде бы все. Но этот механизм не будет правильно списывать партии в том случае, если в документе будут разные изделия, содержащие одинаковые комплектующие. Это показывает разницу в алгоритмическом подходе при использовании компонент Оперативный учет и Бухгалтерский учет. В Оперативном учете можно проводя строки документа все время отслеживать меняющиеся остатки, а в Бухгалтерском учете операция формируется в самом конце.
Например, в изделии А (10 шт.) есть комплектующая К, и в изделии Б (10 шт.) есть комплектующая К. Суммарно изделие К должно быть списано из партии 1 и из партии 2 по 10 штук, но этот механизм дважды спишет К из партии 1. А это неправильно. Перепишем эту процедуру заново:
Процедура ОбработкаПроведения()
  Если Склад.Выбран()=0 Тогда
    Сообщить("Документ Наряд на сборку №"+НомерДок+" от "+ДатаДок+"
    |не проведен.
    |Не выбран склад заготовок");
    НеПроводитьДокумент();
    Возврат;
  КонецЕсли;
  Если Сборщик.Выбран()=0 Тогда
    Сообщить("Документ Наряд на сборку №"+НомерДок+" от "+ДатаДок+"
    |не проведен.
    |Не указан сборщик");
    НеПроводитьДокумент();
    Возврат;
  КонецЕсли;
  ТабЗн=СоздатьОбъект("ТаблицаЗначений");
  ТабЗн.НоваяКолонка("Ком","Справочник.Комплектующие");
  ТабЗн.НоваяКолонка("Кол","Число",12,0);
  СпрКом=СоздатьОбъект("Справочник.Комплектация");
  ВыбратьСтроки();
  Пока ПолучитьСтроку()=1 Цикл
    СпрКом.ИспользоватьВладельца(Изделие);
    СпрКом.ВыбратьЭлементы();
    Пока СпрКом.ПолучитьЭлемент()=1 Цикл
      ТабЗн.НоваяСтрока();
      ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;
      ТабЗн.Кол=Кол;
    КонецЦикла;
    СпрКом.ИспользоватьВладельца("");
  КонецЦикла;
  БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
  БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
  БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
  ФлагОтказа=0;
  ТабЗн.Свернуть("1","2");
  ТабЗн.ВыбратьСтроки();
  Пока ТабЗн.ПолучитьСтроку()=1 Цикл
    Ком=ТабЗн.Ком;
    Колич=ТабЗн.Кол;
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
    БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
    КолКом=БухИтоги.СКД(3);
    Если Колич>КолКом Тогда
      ФлагОтказа=1;
      Сообщить(Строка(Ком));
    КонецЕсли;
  КонецЦикла;
  Если ФлагОтказа=1 Тогда
    Сообщить("Документ Наряд на сборку №"+НомерДок+" от "+ДатаДок+"
    |не проведен.
    |Заказ по вышеперечисленным позициям
    |превышает остаток на складе");
    НеПроводитьДокумент();
    Возврат;
  КонецЕсли;
// Без изменений
  ТабКом=СоздатьОбъект("ТаблицаЗначений");
  ТабКом.НоваяКолонка("Ком","Справочник.Комплектующие");
  ТабКом.НоваяКолонка("Док","Документ.ПриходнаяНакладная");
  ТабКом.НоваяКолонка("Кол","Число",10,0);
  ТабКом.НоваяКолонка("Сум","Число",14,2);
// В этой таблице мы будем хранить список комплектующих в разрезе партий
// в количестве, достаточном для списания
  ТабЗн.Сортировать("1+");
  ТабЗн.ВыбратьСтроки();
  Пока ТабЗн.ПолучитьСтроку()=1 Цикл
    КомП=ТабЗн.Ком;
    КолКом=ТабЗн.Кол;
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,КомП,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);
    БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
    БухИтоги.ВыбратьСубконто(3);
    Пока БухИтоги.ПолучитьСубконто(3)=1 Цикл
      ДокП=БухИтоги.Субконто(3);
      КолП=БухИтоги.СКД(3);
      СумП=БухИтоги.СКД(1);
      Если КолКом>0 Тогда
// Заполняем таблицу по комплектующим-партиям
        ТабКом.НоваяСтрока();
        ТабКом.Ком=КомП;
        ТабКом.Док=ДокП;
        ТабКом.Кол=КолП;
        ТабКом.Сум=СумП;
        КолКом=КолКом-КолП;
      Иначе
        Прервать;
// Чтобы не выбирать лишних партий
      КонецЕсли;
    КонецЦикла;
  КонецЦикла;
  ТабЗн.УдалитьСтроки();
  ТабЗн="";
  ТабКом.Сортировать("1+,2+");
  СуммаОпер=0;
  ВыбратьСтроки();
  Пока ПолучитьСтроку()=1 Цикл // По Изделию
    НС=НомерСтроки;
    Изд=Изделие;
    СпрКом.ИспользоватьВладельца(Изделие);
    СпрКом.ВыбратьЭлементы();
    Пока СпрКом.ПолучитьЭлемент()=1 Цикл // По Комплектующей
      Колич=Кол;
      КомТ=СпрКом.ТекущийЭлемент().Комплектующее;
      ТабКом.ВыбратьСтроки();
      Пока ТабКом.ПолучитьСтроку()=1 Цикл // По Партии
// Выбираем партии из динамической таблицы!
        КомП=ТабКом.Ком;
        Если КомП<>КомТ Тогда
          Продолжить;
// Запрашиваемая комплектующая не соответствует строке в таблицу, идем дальше
        КонецЕсли;
        ДокП=ТабКом.Док;
        КолП=ТабКом.Кол;
        Если КолП=0 Тогда
// Партия уже опустошена, пропускаем
          Продолжить;
        КонецЕсли;
        СумП=ТабКом.Сум;
        СтрП=ТабКом.НомерСтроки;
        Если Колич>КолП Тогда
          ПривязыватьСтроку(НС);
          Операция.НоваяПроводка();
          Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
          Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
          Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
          Операция.Дебет.Изделие = Изделие;
          Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();
          Операция.Кредит.МестоХранения = Склад;
          Операция.Кредит.Комплектующее = КомП;
          Операция.Кредит.ПриходнаяНакладная = ДокП;
          Операция.Фирма = ФирмаДокумента;
          Операция.Комментарий = "Передача комплектующих на сборку";
          Операция.НомерЖурнала = "10";
          Операция.Сумма = СумП;
          Операция.Количество = КолП;
          Колич=Колич-КолП;
          СуммаОпер=СуммаОпер+СумП;
          ТабКом.УстановитьЗначение(СтрП,"Кол",0);
          ТабКом.УстановитьЗначение(СтрП,"Сум",0);
// Опустошаем партию полностью
        Иначе
          СумО=Окр(Колич*(СумП/КолП),2,1);
          ПривязыватьСтроку(НС);
          Операция.НоваяПроводка();
          Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
          Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
          Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
          Операция.Дебет.Изделие = Изделие;
          Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();
          Операция.Кредит.МестоХранения = Склад;
          Операция.Кредит.Комплектующее = КомП;
          Операция.Кредит.ПриходнаяНакладная = ДокП;
          Операция.Фирма = ФирмаДокумента;
          Операция.Комментарий = "Передача комплектующих на сборку";
          Операция.НомерЖурнала = "10";
          Операция.Сумма = СумО;
          Операция.Количество = Колич;
          СуммаОпер=СуммаОпер+СумО;
          ТабКом.УстановитьЗначение(СтрП,"Кол",КолП-Колич);
          ТабКом.УстановитьЗначение(СтрП,"Сум",СумП-СумО);
// Опустошаем партию частично и переходим к следующей комплектующей
          Прервать;
        КонецЕсли;
      КонецЦикла; // По Партии
    КонецЦикла; // По Комплектующей
  КонецЦикла; // По Изделию
  Операция.Содержание = "Запуск производства";
  Операция.СуммаОперации = СуммаОпер;
  Операция.Автор = АвторДокумента;
  Операция.Записать();
КонецПроцедуры
Новый вариант хотя и сложнее, но работает правильно. И даже быстрее, так как обращений к Бухгалтерским итогам будет меньше или столько же, ведь они вынесены за цикл по изделиям.
Проверим работу нашего документа с разными наборами данных.


Предыдущая Содержание Следующая