Как подключить типовой подбор серий к самописному документу в 1С:ERP

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет IT и автоматизация бизнеса
← На главную

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

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

Архитектура механизма регистрации серий

Проанализируем, почему типовая форма подбора серий не открывается простым вызовом:

  1. Передача данных через временное хранилище: Формы регистрации серий (например, РегистрацияИПодборСерийПоОднойСтрокеТоваров) требуют адрес во временном хранилище. Метод НоменклатураСервер.ПараметрыФормыУказанияСерий подготавливает структуру данных строки документа, помещает ее во временное хранилище и передает адрес в параметры формы.
  2. Реквизит формы документа: Переменная ПараметрыУказанияСерий не является глобальной переменной или встроенной функцией модуля формы. Это реквизит формы произвольного типа, который должен быть создан на форме документа и инициализирован при чтении объекта на сервере.
  3. Методы модуля менеджера: Серверные процедуры подсистемы номенклатуры обращаются к модулю менеджера конкретного документа для получения списка ключевых реквизитов и правил заполнения настроек серий.

Подготовка структуры метаданных документа

Перед написанием программного кода проверим состав реквизитов табличной части нашего документа (например, ТЧ Товары):

  1. Номенклатура — тип СправочникСсылка.Номенклатура.
  2. Характеристика (если используется) — тип СправочникСсылка.ХарактеристикиНоменклатуры.
  3. Серия — тип СправочникСсылка.СерииНоменклатуры.
  4. СтатусУказанияСерий — тип Число (отражает состояние: не требуется, требуется указать, заполнено).
  5. Количество / КоличествоУпаковок — числовые поля количества.

Шаг 1. Настройка модуля менеджера документа

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


Функция ИменаРеквизитовДляЗаполненияПараметровУказанияСерий() Экспорт
    
    // Перечисляем через запятую реквизиты шапки документа, влияющие на политику учета серий
    ИменаРеквизитов = "Подразделение,Склад,Дата";
    Возврат ИменаРеквизитов;
    
КонецФункции

Функция ПараметрыУказанияСерий(Объект) Экспорт
    
    ПараметрыУказанияСерий = НоменклатураКлиентСервер.ПараметрыУказанияСерий();
    ПараметрыУказанияСерий.ПолноеИмяОбъекта = "Документ.СамописныйДокумент";
    ПараметрыУказанияСерий.ИмяТЧТовары = "Товары";
    ПараметрыУказанияСерий.ИмяТЧСерии  = "Товары";
    
    // Если на складе включен учет серий
    ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатурыСклад", Новый Структура("Склад", Объект.Склад));
    
    ПараметрыУказанияСерий.Дата = Объект.Дата;
    ПараметрыУказанияСерий.РегистрироватьСерии = Истина;
    
    Возврат ПараметрыУказанияСерий;
    
КонецФункции

Шаг 2. Настройка реквизитов и событий формы документа

Перейдем в форму документа и выполним следующие действия:

  1. Добавим в состав реквизитов формы реквизит с именем ПараметрыУказанияСерий (тип: Произвольный).
  2. В обработчике события формы ПриЧтенииНаСервере выполним инициализацию структуры параметров:

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    // Инициализация фиксированной структуры для работы механизма указания серий
    ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(
        НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.СамописныйДокумент)
    );
    
    // Расчет статусов серий для строк табличной части
    НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект, "Товары");
    
КонецПроцедуры

Также инициализацию необходимо продублировать в событии ПриСозданииНаСервере для новых (еще не записанных) документов.

Шаг 3. Реализация команды открытия формы подбора серий

В модуле формы документа вызов формы подбора серий для текущей строки таблицы реализуется следующим образом:


&НаКлиенте
Процедура ТоварыУказатьСерии(Команда)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПараметрыФормы = ПолучитьПараметрыФормыУказанияСерий(ТекущаяСтрока.ПолучитьИдентификатор());
    
    Если ПараметрыФормы <> Неопределено Тогда
        ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыУказанияСерий", ЭтотОбъект);
        ОткрытьФорму("Обработка.РегистрацияИПодборСерийПоОднойСтрокеТоваров.Форма.Форма", ПараметрыФормы, ЭтотОбъект,,,, ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьПараметрыФормыУказанияСерий(ИдентификаторСтроки)
    
    Возврат НоменклатураСервер.ПараметрыФормыУказанияСерий(
        Объект,
        ПараметрыУказанияСерий,
        ИдентификаторСтроки,
        ЭтаФорма
    );
    
КонецФункции

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

← На главную