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