СОДЕРЖАНИЕ
II ТЕРМИНОЛОГИЯ И ОБЩИЕ ЗАМЕЧАНИЯ
III ОБЩЕЕ ОПИСАНИЕ НЕОБХОДИМЫХ ДОРАБОТОК
1. ИЗМЕНЕНИЯ В КОНФИГУРАЦИИ. ДОБАВЛЕНИЕ ВСПОМОГАТЕЛЬНЫХ ОБЪЕКТОВ В КОНФИГУРАЦИЮ
2 ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА. ВЫГРУЗКА ЭЛЕМЕНТОВ СПРАВОЧНИКА «НОМЕНКЛАТУРА»
3 ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА. ВЫГРУЗКА ПОЛЕЙ ТИПА «НОМЕНКЛАТУРА»
4 ДОПОЛНИТЕЛЬНЫЕ ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА
Ниже рассматривается выгрузка номенклатуры с использованием "Конвертации данных 2". Вариант для "Конвертации данных 3" предложен другим автором: //infostart.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 «ГИ_ПВД_Номенклатура_ПередОбработкойПравила»
Код алгоритма состоит из последовательного вызова алгоритмов:
Алгоритм 2 «ГИ_ИнициализироватьВТНоменклатурыНаВыгрузку»
Помещаем во временную таблицу «ВТ_НоменклатураНаВыгрузку» менеджера временных таблиц ГИ_МенеджерВТ выгружаемую номенклатуру и её характеристики:
- номенклатуру, для которой зарегистрированы изменения (из типовой выборки ВыборкаИзменений)
- всю номенклатуру с характеристиками, для которой ещё нет записей в регистре «ГИ_КодыНоменклатурыНаВыгрузкуВБухгалтерию». Так как при создании новой характеристики для существующей номенклатуры эта номенклатура не регистрируется как изменённая, то ВыборкаИзменений не будет содержать эту номенклатуру. Поэтому мы принудительно добавляем на выгрузку такую номенклатуру, ориентируясь на содержимое регистра «ГИ_КодыНоменклатурыНаВыгрузкуВБухгалтерию».
Алгоритм 3 «ГИ_ПолучитьПоследнююНоменклатуруВВыборкеИзменений»
Записываем в переменную ГИ_ПоследняяНоменклатура последний элемент выборки ВыборкаИзменений с типом «Номенклатура», чтобы после нашей выгрузки позиционировать выборку ВыборкаИзменений на этом элементе – тогда типовой цикл выгрузки на следующих итерациях продолжит свою работу по выгрузке данных других типов.
Алгоритм 4 «ГИ_ПолучитьНоменклатуруДляПоследнейИтерации»
Записываем в переменную ГИ_НоменклатураДляВыгрузкиНаПоследнейИтерации номенклатуру, которую мы можем выгрузить типовым образом – то есть номенклатуру, которая будет обработана в строчке ВыгрузкаОбъектаВыборки(Данные, …) типового цикла выгрузки. Эту строчку типового цикла мы не можем пропустить (т.к. не меняем конфигурацию), поэтому должны «скормить» ей какую-то подходящую номенклатуру.
Подходящей не может быть номенклатура с характеристиками (т.к. такую номенклатуру мы выгружаем по-особому), поэтому в качестве такой номенклатуры может выступать либо группа, либо номенклатура без характеристик. Поиск такой номенклатуры и реализован в алгоритме.
Алгоритм 5 «ГИ_ВыгрузитьНоменклатуру»
Основной алгоритм выгрузки. Обходим в цикле выгружаемую номенклатуру из временной таблицы «ВТ_НоменклатураНаВыгрузку», подготовленной выше.
Если это номенклатура с характеристиками, то получаем данные виртуальной номенклатуры с помощью алгоритма «ГИ_ПолучитьДанныеНоменклатурыИзРегистраКодов».
Данные номенклатуры присваиваем переменной Данные и запускаем кусок кода выгрузки из типового цикла, вынесенный в алгоритм «ГИ_ВыполнитьТиповойКодВыгрузкиНоменклатуры».
Алгоритм 5.1 «ГИ_ПолучитьДанныеНоменклатурыИзРегистраКодов»
Получаем код виртуальной номенклатуры из регистра «ГИ_КодыНоменклатурыНаВыгрузкуВБухгалтерию» по комбинации «Номенклатура + Характеристика».
Если такой записи в регистре нет (если эта комбинация выгружается впервые), то с помощь алгоритма «ГИ_ПолучитьНовыйКодНоменклатурыДляВыгрузки» генерируем новый код виртуальной номенклатуры и записываем его в регистр.
В качестве наименования виртуальной номенклатуры возвращаем строку, состоящую из наименований номенклатуры и характеристики, разделённых пробелом.
Алгоритм 5.1.1 «ГИ_ПолучитьНовыйКодНоменклатурыДляВыгрузки»
Получаем код новой виртуальной номенклатуры, увеличивая на единицу значение константы «ГИ_ПоследнийКодНоменклатурыНаВыгрузкуВБухгалтерию».
Записываем новое значение последнего кода в константу.
Добавляем префикс «ПХ» к коду, чтобы избежать конфликтов с кодами номенклатуры без характеристик, которая выгружается в бухгалтерию как есть.
Алгоритм 5.2 «ГИ_ВыполнитьТиповойКодВыгрузкиНоменклатуры»
Алгоритм содержит часть кода типового цикла процедуры ВыполнитьВыгрузкуЗарегистрированныхДанных модуля объекта обработки КонвертацияОбъектовИнформационныхБаз. Изменения в типовом коде помечены текстом "ИЗМЕНЕНО".
Этот код выгружает данные номенклатуры, которые предварительно сохранены в переменной Данные.
Алгоритм 6 «ГИ_ИнициализироватьПоследнююИтерацию»
Позиционирует выборку ВыборкаИзменений на последний элемент типа «Номенклатура», чтобы на следующей итерации типового цикла продолжилась выгрузка объектов других типов.
Переменной Данные присваивается значение, означенное в алгоритме «ГИ_ПолучитьНоменклатуруДляПоследнейИтерации», чтобы успешно отработал код ВыгрузкаОбъектаВыборки(Данные, …) в текущей итерации типового цикла.
3 ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА. ВЫГРУЗКА ПОЛЕЙ ТИПА «НОМЕНКЛАТУРА»
При выгрузке реквизита типа «Номенклатура» необходимо, чтобы:
- номенклатура без характеристик выгружалась типовым способом
- вместо номенклатуры с характеристиками выгружался код виртуальной номенклатуры
Необходимо внести изменения в обработчик «ПриВыгрузке» правила конвертации свойств. Например, в правило конвертации свойств поля «Номенклатура» табличной части «Товары» документа «ПоступлениеТоваровУслуг».
Изменения необходимо вносить для полей «Номенклатура» правил конвертации свойств всех объектов, выгружаемых в бухгалтерию.
Код правила вынесен в алгоритм «ГИ_ПКС_Номенклатура_ПриВыгрузкеСвойства».
Выполнить(Алгоритмы.ГИ_ПКС_Номенклатура_ПриВыгрузкеСвойства);
Алгоритм 7 «ГИ_ПКС_Номенклатура_ПриВыгрузкеСвойства»
Если в поле типа «Номенклатура» содержится номенклатура с характеристиками, то необходимо выгрузить код соответствующей виртуальной номенклатуры, полученный алгоритмом «ГИ_ПолучитьДанныеНоменклатурыИзРегистраКодов».
4 ДОПОЛНИТЕЛЬНЫЕ ИЗМЕНЕНИЯ В ПРАВИЛАХ ОБМЕНА
Типовые правила конвертации некоторых объектов могут содержать изменения в обработчиках событий. Если эти объекты выгружаются в бухгалтерию, необходимо проверить обработчики событий этих объектов и исправить их при необходимости.
Например, в правилах обмена УНФ-Бухгалтерия изменён обработчик события «ПередВыгрузкой» правила конвертации объекта «КорректировкаРеализации».
Код обработчика состоит из запроса, результат которого не включает поле «Характеристика». Необходимо добавить в секцию «ВЫБРАТЬ» запроса нужное поле:
Готовое решение
Характеристики номенклатуры в 1С: УТ, УНФ, Розница, КА
Обработка позволяет заменить в объектах базы (документы, справочники, регистры, последовательности) исходную номенклатуру без характеристик на новую номенклатуру с характеристиками. Обработки предназначены для тех, кому необходимо быстро перевести рабочую базу на учёт по характеристикам для целей сокращения справочника номенклатуры и подготовки базы для интеграции с интернет-магазином на 1С-Битрикс.