Характеристики номенклатуры. Выгрузка характеристик номенклатуры в бухгалтерию
Эта статья может быть полезна тем, кто хочет избежать «свёртки» номенклатуры с характеристиками при выгрузке в базу бухгалтерии. В «1С Бухгалтерия» версий 2.0 и 3.0 нет понятия «характеристика номенклатуры», поэтому при выгрузке, например, из УНФ в базу бухгалтерии номенклатура с характеристиками сворачивается в одну позицию без характеристик. В статье на примере конфигураций «УНФ 1.6» и «БП 3.0» описана доработка правил обмена, которая позволяет выгружать каждую комбинацию «Номенклатура + Характеристика» в виде независимой номенклатуры в базу бухгалтерии.
- Описание
- Подробнее
Описание
СОДЕРЖАНИЕ
II ТЕРМИНОЛОГИЯ И ОБЩИЕ ЗАМЕЧАНИЯ
III ОБЩЕЕ ОПИСАНИЕ НЕОБХОДИМЫХ ДОРАБОТОК
1. ИЗМЕНЕНИЯ В КОНФИГУРАЦИИ. ДОБАВЛЕНИЕ ВСПОМОГАТЕЛЬНЫХ ОБЪЕКТОВ В КОНФИГУРАЦИЮ
2 ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА. ВЫГРУЗКА ЭЛЕМЕНТОВ СПРАВОЧНИКА «НОМЕНКЛАТУРА»
3 ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА. ВЫГРУЗКА ПОЛЕЙ ТИПА «НОМЕНКЛАТУРА»
4 ДОПОЛНИТЕЛЬНЫЕ ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА
Ниже рассматривается выгрузка номенклатуры с использованием "Конвертации данных 2". Вариант для "Конвертации данных 3" предложен другим автором: //sale.itcity.ru/public/1012589/
При переводе базы УНФ 1.6 на учёт номенклатуры по характеристикам для одного из клиентов (с помощью обработок infostart.ru/public/556773/) мы столкнулись с тем, что клиент не хочет менять структуру номенклатуры в связанной базе бухгалтерии БП 3.0.
Проблема сводилась к следующему:
Допустим, в базе УНФ ведётся учёт по характеристикам и присутствует номенклатура «Бетолюкс аква краска для полов» с шестью характеристиками «A 0.9 л»; «A 2.7 л»; «A 9 л»; «C 0.9 л»; «C 2.7 л»; «C 9 л».
В базе БП 3.0 отсутствует возможность вести учёт в разрезе характеристик, поэтому при выгрузке в бухгалтерию эта номенклатура свернётся в одну общую позицию номенклатуры «Бетолюкс аква краска для полов» без характеристик.
Допустим, мы хотим, чтобы каждая комбинация «Номенклатура + Характеристика» была выгружена в базу бухгалтерии в виде независимой позиции номенклатуры без характеристик, то есть чтобы в бухгалтерии нашей номенклатуре с шестью характеристиками из УНФ соответствовали шесть позиций номенклатуры без характеристик:
1) «Бетолюкс аква краска для полов A 0.9 л»
2) «Бетолюкс аква краска для полов A 2.7 л»
3) «Бетолюкс аква краска для полов A 9 л»
4) «Бетолюкс аква краска для полов C 0.9 л»
5) «Бетолюкс аква краска для полов C 2.7 л»
6) «Бетолюкс аква краска для полов C 9 л»
Далее в статье предлагается способ решения описанной задачи.
Сразу оговоримся, что:
1. Решение тестировалось только на конфигурациях «УНФ 1.6.10.38» и «Бухгалтерия 3.0.52.39». Всё же постараемся описать решение в виде общего алгоритма, не привязанного к конкретным конфигурациям.
2. Решение затрагивает только односторонний обмен УНФ -> Бухгалтерия.
3. Предполагается, что синхронизация номенклатуры выполняется по реквизиту «Код».
4. Предполагается, что используются индивидуальные характеристики номенклатуры (не рассматривается вариант характеристик, общих для вида номенклатуры).
5. Решение предполагает добавление в конфигурацию одной константы и одного регистра сведений
6. Решение предполагает изменение правил обмена (а это значит, что при обновлении правил обмена необходимо будет переносить изменения в новые правила обмена).
II ТЕРМИНОЛОГИЯ И ОБЩИЕ ЗАМЕЧАНИЯ
Далее в статье под «виртуальной» номенклатурой понимается номенклатура, выгружаемая в бухгалтерию для каждой комбинации «Номенклатура + Характеристика» (выше в примере это, например, номенклатура «Бетолюкс аква краска для полов A 0.9 л»).
Идентификаторы объектов и переменных, которые будут встречаться далее, могут включать префикс «ГИ_». Этот префикс мы добавляем к собственным объектам при редактировании типовых конфигураций.
III ОБЩЕЕ ОПИСАНИЕ НЕОБХОДИМЫХ ДОРАБОТОК
Обмен с бухгалтерией в контексте выгрузки номенклатуры состоит из двух этапов:
Этап 1. Выгрузка элементов справочника «Номенклатура»
Этап 2. Выгрузка полей типа «Номенклатура» (например, реквизитов «Номенклатура» в табличных частях документов)
Рассмотрим подробнее, каким образом нам необходимо модифицировать выгрузку на каждом из этапов.
Этап 1. Выгрузка элементов справочника «Номенклатура»
При выгрузке группы номенклатуры должная отрабатывать типовая выгрузка.
При выгрузке номенклатуры, для которой НЕ ведётся учёт по характеристикам, должна отрабатывать типовая выгрузка.
При выгрузке номенклатуры, для которой ведётся учёт по характеристикам, необходимо вместо одной позиции номенклатуры выгружать новые позиции, соответствующие комбинациям «Номенклатура + Характеристика».
Так как синхронизация у нас выполняется по реквизиту «Код», для каждой виртуальной номенклатуры необходимо будет генерировать уникальный код.
Этот код необходимо будет где-то сохранять, чтобы при следующем обмене с бухгалтерией не генерировать новый код для ранее выгруженной виртуальной номенклатуры (иначе в бухгалтерии будут дубли виртуальной номенклатуры).
Для каждой виртуальной номенклатуры необходимо будет генерировать своё наименование.
Этап 2. Выгрузка полей типа «Номенклатура»
На этом этапе выгружается код, соответствующий полю «Номенклатура».
При выгрузке номенклатуры, для которой НЕ ведётся учёт по характеристикам, должна отрабатывать типовая выгрузка (выгружается код этой номенклатуры).
Если для номенклатуры ведётся учёт по характеристикам, то при выгрузке поля типа «Номенклатура» нужно подменять код этой номенклатуры на код виртуальной номенклатуры.
Предполагается, что в той же структуре, которой принадлежит поле «Номенклатура», мы можем найти и поле «Характеристика», чтобы однозначно идентифицировать выгружаемую виртуальную номенклатуру.
Например, при выгрузке поля «Номенклатура» из табличной части документа «РасходнаяНакладная» мы в этой же табличной части можем найти реквизит «Характеристика».
Код виртуальной номенклатуры мы будем находить по комбинации полей «Номенклатура» + «Характеристика» в регистре сведений, в который этот код был записан на этапе 1.
1. ИЗМЕНЕНИЯ В КОНФИГУРАЦИИ. ДОБАВЛЕНИЕ ВСПОМОГАТЕЛЬНЫХ ОБЪЕКТОВ В КОНФИГУРАЦИЮ
Изменения в конфигурации будут состоять только в добавлении двух объектов для генерации и сохранения кодов виртуальной номенклатуры:
1. Константа «ГИ_ПоследнийКодНоменклатурыНаВыгрузкуВБухгалтерию», которая будет хранить максимальный на данный момент код виртуальной номенклатуры
2. Регистр сведений для кодов виртуальной номенклатуры:
Имя: ГИ_КодыНоменклатурыНаВыгрузкуВБухгалтерию
Периодичность: Непериодический
Режим записи: Независимый
Измерения:
| Имя | Тип | Индексировать |
| Код | Строка; Длина: 11; Допустимая длина: Переменная | Да |
| Номенклатура | СправочникСсылка.Номенклатура | Да |
| Характеристика | СправочникСсылка.ХарактеристикаНоменклатуры | Да |
2 ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА. ВЫГРУЗКА ЭЛЕМЕНТОВ СПРАВОЧНИКА «НОМЕНКЛАТУРА»
Необходимо исправить правила обмена, чтобы:
— группы номенклатуры выгружались типовым способом
— номенклатура без характеристик выгружалась типовым способом
— номенклатура с характеристиками разворачивалась в нужное количество позиций виртуальной номенклатуры
— для виртуальной номенклатуры генерировался и сохранялся код в регистре сведений
— максимальный код виртуальной номенклатуры сохранялся в константе (для генерации новых кодов виртуальной номенклатуры)
— для виртуальной номенклатуры генерировалось наименование
Изменения будем вносить в правило выгрузки данных справочника «Номенклатура», обработчик «Перед обработкой».

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