При разработке внешних обработок для интеграции с подсистемой ЕГАИС в конфигурациях «1С:Розница», «1С:Управление торговлей» или «1С:ERP» разработчики часто сталкиваются с двумя типовыми проблемами при переносе данных из документов остатков в документы перемещения:
ОстаткиЕГАИС) присутствует только классификатор алкогольной продукции (реквизит АлкогольнаяПродукция), а в целевом документе (ПередачаВТорговыйЗалЕГАИС) требуются одновременно и Номенклатура учетной системы, и АлкогольнаяПродукция.Количество не сохраняется или отображается пустым, хотя в отладчике значение успешно присваивается.Разберем причины такого поведения платформы и построим корректный алгоритм создания и заполнения документа.
В типовых конфигурациях 1С справочник Номенклатура и справочник КлассификаторАлкогольнойПродукцииЕГАИС напрямую не связаны через реквизиты. Их соответствие хранится в специальном регистре сведений — СоответствиеНоменклатурыЕГАИС.
Чтобы получить позицию номенклатуры учетной системы по элементу алкогольной продукции, необходимо выполнить левое соединение с этим регистром по полю АлкогольнаяПродукция.
В табличных частях большинства товароучетных документов конфигурации «1С:Розница» отображаемое и рассчитываемое количество жестко завязано на реквизит КоличествоУпаковок. Если заполнять исключительно реквизит Количество, стандартные механизмы пересчета при записи объекта или при открытии формы пересчитывают его на основании пустых упаковок и коэффициентов, что приводит к обнулению данных.
Для корректного заполнения табличной части необходимо явно передавать значение в реквизит КоличествоУпаковок, либо заполнять оба реквизита одновременно.
Проанализируем распространенную ошибку при работе с выборкой данных запроса:
Выборка = Запрос.Выполнить().Выбрать();
НовДок.Магазин = Выборка.Магазин; // Ошибка: позиционирование еще не выполнено
НовДок.Склад = Выборка.Склад;
Пока Выборка.Следующий() Цикл
// Заполнение строк
КонецЦикла;
Объект ВыборкаИзРезультатаЗапроса до первого вызова метода Следующий() не указывает ни на одну запись. Обращение к полям шапки до цикла возвращает Неопределено. Для избежания подобных ошибок удобнее выгружать результат запроса в таблицу значений или разделять получение данных шапки и табличной части.
Рассмотрим готовый вариант кода обработки. Для упрощения сопоставления полей используем процедуру ЗаполнитьЗначенияСвойств, а данные связываем напрямую через регистр сведений СоответствиеНоменклатурыЕГАИС.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
| Остатки.Количество КАК Количество,
| Остатки.Количество КАК КоличествоУпаковок,
| Остатки.СправкаБ КАК СправкаБ,
| ЕСТЬNULL(Соответствие.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура
|ИЗ
| Документ.ОстаткиЕГАИС.ОстаткиПоДаннымЕГАИС КАК Остатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК Соответствие
| ПО Остатки.АлкогольнаяПродукция = Соответствие.АлкогольнаяПродукция
|ГДЕ
| Остатки.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДокументОстатки);
ТаблицаТоваров = Запрос.Выполнить().Выгрузить();
// Создаем новый документ перемещения
НовДок = Документы.ПередачаВТорговыйЗалЕГАИС.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
НовДок.ОрганизацияЕГАИС = ДокументОстатки.ОрганизацияЕГАИС;
// Заполняем строки табличной части
Для Каждого СтрДанных Из ТаблицаТоваров Цикл
НовСтр = НовДок.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, СтрДанных);
// Если учет ведется без упаковок, обязательно инициализируем коэффициент
Если НовСтр.Коэффициент = 0 Тогда
НовСтр.Коэффициент = 1;
КонецЕсли;
КонецЦикла;
// Записываем документ
НовДок.Записать(РежимЗаписиДокумента.Запись);
ПередачаВТорговыйЗалЕГАИС (перемещение с Регистра №1 на Регистр №2) по методологии ЕГАИС применяется только для немаркируемой алкогольной продукции (пиво, сидр, медовуха). Маркированная продукция учитывается поштучно на Регистре №1 и Регистре №3, перемещение её в торговый зал запрещено регламентом ФСРАР.СоответствиеНоменклатурыЕГАИС одной позиции алкогольной продукции может соответствовать несколько связок с учетом характеристик или серий. При формировании запроса рекомендуется следить за уникальностью записей, чтобы избежать задвоения строк.