Синхронизация нормативно-справочной информации (НСИ) в крупной холдинговой структуре — это классическая головная боль ИТ-отдела. Ситуация усугубляется, когда в компании функционирует несколько десятков разрозненных баз данных (в нашем случае от 30 до 40 баз «1С:Бухгалтерия предприятия»), пользователи привыкли к полной свободе действий, регламенты работы отсутствуют, а руководство не готово инвестировать в тяжелые комплексные решения уровня 1С:Управление холдингом или специализированные MDM-системы. Кроме того, отсутствует административный ресурс для принудительного наведения порядка руками пользователей.
В этой статье мы подробно разберем, как решить задачу обеспечения единой НСИ (Контрагенты и Номенклатура) силами разработчиков 1С, используя гибкие механизмы платформы «1С:Предприятие 8.3», расширения, веб-сервисы и встроенный функционал.
---
Для контрагентов решение лежит на поверхности благодаря переходу на современные редакции программ. Если перевести все базы на редакцию «Бухгалтерия предприятия 3.0», можно задействовать встроенный механизм заполнения по ИНН.
Давайте проанализируем план действий для унификации контрагентов:
Ниже рассмотрим пример кода для программного создания контрагента по ИНН. Мы можем вызвать стандартные процедуры общего модуля БП 3.0 (в разных версиях имена модулей могут незначительно отличаться, но суть остается единой):
// Пример программного заполнения данных контрагента по ИНН в БП 3.0
Процедура ЗаполнитьКонтрагентаПоИНН(НовыйКонтрагентСсылка, ЗначениеИНН) Экспорт
КонтрагентОбъект = НовыйКонтрагентСсылка.ПолучитьОбъект();
КонтрагентОбъект.ИНН = ЗначениеИНН;
// Используем программный вызов подсистемы работы с сервисом 1С:Контрагент
ДанныеИНН = РаботаСАдресамиКлиентСервер.СведенияОЮридическомЛице(ЗначениеИНН);
Если ДанныеИНН <> Неопределено Тогда
КонтрагентОбъект.Наименование = ДанныеИНН.СокращенноеНаименование;
КонтрагентОбъект.НаименованиеПолное = ДанныеИНН.ПолноеНаименование;
КонтрагентОбъект.КПП = ДанныеИНН.КПП;
КонтрагентОбъект.Записать();
КонецЕсли;
КонецПроцедуры
---
С номенклатурой ситуация сложнее: у нее нет единого государственного реестра, аналогичного ЕГРЮЛ/ЕГРИП для контрагентов. Нам требуется создать техническое решение, которое обеспечит сквозную идентичность элементов (как минимум равенство кодов, наименований и ключевых реквизитов, а в идеале — совпадение внутренних идентификаторов UUID) во всех базах.
Выясним преимущества и недостатки основных подходов к решению этой задачи.
---
Это наиболее технологичный и современный подход, который работает в режиме реального времени и незаметен для конечного пользователя.
Суть метода: Мы выделяем одну из баз в качестве «Мастер-базы» (это может быть база головной организации). В ней публикуется разработанный нами HTTP-сервис. Во все остальные 39 баз устанавливается легкое Расширение конфигурации, которое перехватывает попытку создания новой номенклатуры.
Разберем алгоритм работы по шагам:
UUID). Периферийная база записывает элемент именно с этим UUID.UUID, который возвращается в периферийную базу для создания локальной копии.Рассмотрим пример кода отправки запроса из локальной базы в Мастер-базу через HTTP-соединение:
// Функция отправки запроса создания/поиска номенклатуры в Мастер-базу
Функция ПолучитьНоменклатуруИзМастерБазы(Наименование, Артикул)
АдресСервера = "master-nsi.company.local";
ИмяРесурса = "/v1/nomenclature/search";
HTTPСоединение = Новый HTTPСоединение(АдресСервера, , "API_User", "Password_123");
// Формируем JSON-тело запроса
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("Name", Наименование);
ПараметрыЗапроса.Вставить("Article", Артикул);
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
HTTPЗапрос = Новый HTTPЗапрос(ИмяРесурса);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбъекта(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Возврат HTTPОтвет.ПолучитьТелоКакСтроку();
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("НСИ.Обмен", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Возврат Неопределено;
КонецФункции
---
Если постоянное онлайн-соединение между базами нестабильно, целесообразно использовать асинхронную схему обмена по расписанию.
Реализация схемы:
ПО_СинхронизацияНСИ). В состав отправляемых данных включается только справочник Номенклатура (и сопутствующие: КлассификаторЕдиницИзмерения, НоменклатурныеГруппы).UUID элементов.Для реализации этого сценария отлично подойдет современный универсальный формат обмена EnterpriseData, встроенный в платформу 1С. Это избавит вас от необходимости писать и поддерживать устаревшие правила обмена в программе «Конвертация данных 2.0».
---
Многие разработчики забывают про готовое облачное решение от самой фирмы 1С, которое не требует разработки собственных систем контроля.
Как организовать процесс:
---
Если бизнес-процессы компании не позволяют запретить ручной ввод названий (например, специфика производства), технически можно опереться на штрихкодирование:
Номенклатура реквизит Штрихкод (или штрихкод в подчиненном регистре сведений) делается строго обязательным к заполнению при записи элемента.---
Один из самых частых вопросов при внедрении единой НСИ: «Как объединить справочники и документы, если базы велись весь год обособленно, а сведение нужно сделать прямо сейчас?»
Рассмотрим по шагам технологию слияния данных через перенос документов и перепривязку НСИ:
Прежде чем переносить документы или объединять базы, пишется техническая таблица соответствий (транслятор). В ней фиксируется, какому элементу из локальной Базы А соответствует элемент из Мастер-Базы. Сопоставление выполняется программно:
Если принято решение объединить учет нескольких организаций в одну физическую базу (чтобы облегчить администрирование), используется встроенная обработка «Выгрузка загрузка данных XML»:
Номенклатура, Контрагент) автоматически подменялись на эталонные элементы из объединенной базы, не создавая дублей.Пример концептуальной схемы сопоставления объектов при загрузке данных:
// Фрагмент алгоритма сопоставления при загрузке сторонних данных
Процедура ПриЗагрузкеОбъекта(ОбъектДанных, СвойстваОбъекта)
ТипОбъекта = ТипЗнч(ОбъектДанных);
Если ТипОбъекта = Тип("СправочникОбъект.Номенклатура") Тогда
// Ищем эталонный UUID по нашей таблице соответствий
ЭталоннаяСсылка = НайтиЭталоннуюНоменклатуру(ОбъектДанных.Артикул, ОбъектДанных.Наименование);
Если ЗначениеЗаполнено(ЭталоннаяСсылка) Тогда
// Перенаправляем ссылку загружаемого объекта на эталон
ОбъектДанных.Ссылка = ЭталоннаяСсылка;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
---
Обеспечить единую НСИ в 40 базах без административного ресурса и дорогих MDM-систем — задача сложная, но вполне решаемая техническими методами платформы «1С:Предприятие 8.3».
Главные выводы нашего разбора:
Используя данные подходы, ИТ-отдел сможет навести порядок в учете холдинга исключительно техническими средствами, не вовлекая пользователей в сложные процессы ручной чистки справочников.