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