Как найти документ или план счетов по наименованию в 1С при текстовом обмене

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При проектировании систем интеграции и обмена данными разработчики часто сталкиваются с задачей сопоставления объектов. Если для справочников стандартным и привычным решением является использование метода НайтиПоНаименованию() или НайтиПоКоду(), то при попытке перенести этот подход на документы, планы счетов или планы видов характеристик возникают закономерные трудности. Документы не имеют реквизита "Наименование", а логика текстового обмена (например, через файлы формата .txt или .csv) требует однозначного поиска объектов по их строковому представлению.

В этой статье мы подробно разберем, как устроены механизмы поиска для различных прикладных объектов платформы «1С:Предприятие 8», проанализируем ограничения платформы при работе с запросами, рассмотрим современные способы парсинга текстовых представлений документов и изучим лучшие практики организации надежного обмена данными.

Анализ прикладных объектов: у кого есть наименование «из коробки»

Прежде чем писать универсальный код для поиска, давайте четко разделим прикладные объекты платформы по их структуре данных. Не все объекты одинаковы, и то, что работает для справочников, может успешно работать для одних классов метаданных и выдавать ошибку компиляции для других.

1. Справочники, Планы счетов, Планы видов характеристик (ПВХ), Планы видов расчета (ПВР)

Все эти объекты объединяет то, что они имеют стандартные реквизиты Код и Наименование (хотя длину кода или наименования можно установить в 0, по умолчанию они присутствуют). Для этих объектов в платформе реализованы стандартные методы менеджеров:

Таким образом, если перед нами стоит задача найти элемент Плана счетов по строке, мы можем использовать стандартный метод менеджера аналогично справочникам:


// Поиск счета в плане счетов по наименованию
СчетСсылка = ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("Товары на складах");
Если Не СчетСсылка.Пустая() Тогда
    // Объект успешно найден
КонецЕсли;

2. Документы и Бизнес-процессы

Документы и бизнес-процессы отражают события, происходящие во времени. У них принципиально нет и не может быть реквизита Наименование. Их ключевыми идентификаторами в бизнес-логике являются Номер (строка) и Дата (дата и время). Попытка вызвать метод Документы.ОтчетПроизводстваЗаСмену.НайтиПоНаименованию() приведет к ошибке выполнения, так как этот метод отсутствует в менеджере документов.

Для поиска документов платформа предоставляет метод НайтиПоНомеру(), но он требует обязательного понимания контекста периодичности номеров документов.

---

Поиск документов по текстовому представлению

Представим стандартную ситуацию из практики интегратора: внешняя система присылает нам текстовый файл обмена, в котором записана строка вида: "Отчет производства за смену 0000-000001 от 15.05.2026 14:30:00". Нам необходимо получить ссылку на этот документ в нашей информационной базе. Рассмотрим пошагово, как решить эту задачу.

Шаг 1. Выделение номера и даты из строки (Парсинг)

Для того чтобы воспользоваться поиском, нам необходимо вычленить из текстового представления чистый номер документа и его точную дату. Начиная с версии платформы 8.3.23, разработчикам доступен мощный встроенный инструмент — регулярные выражения. Больше не нужно использовать нестабильные COM-объекты или писать сложные циклы посимвольного перебора.

Рассмотрим пример парсинга строки регулярным выражением для получения номера и даты:


СтрокаПредставления = "Отчет производства за смену 0000-000001 от 15.05.2026 14:30:00";

// Регулярное выражение для поиска номера (цифры и дефисы) и даты с временем
ШаблонРегВыр = ".*?([A-Za-z0-9А-Яа-я№\-]+)\s+от\s+(\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2}:\d{2})";

РезультатПоиска = СтрНайтиПоРегулярномуВыражению(СтрокаПредставления, ШаблонРегВыр, НаправлениеПоиска.Вперед);

Если РезультатПоиска.Количество() > 0 Тогда
    // Получаем подстроки по группам захвата
    НомерДокумента = РезультатПоиска[0].Группы[0].Значение;
    СтрокаДаты     = РезультатПоиска[0].Группы[1].Значение;
    
    // Преобразуем строковую дату в тип Дата 1С
    ДатаДокумента = Дата(Сред(СтрокаДаты, 7, 4) + Сред(СтрокаДаты, 4, 2) + Сред(СтрокаДаты, 1, 2) 
                    + Сред(СтрокаДаты, 11, 9));
                    
    Сообщить("Выделен номер: " + НомерДокумента + ", Дата: " + ДатаДокумента);
Иначе
    Сообщить("Не удалось распознать формат строки представления документа!");
КонецЕсли;

Шаг 2. Использование метода НайтиПоНомеру()

После того как мы успешно получили номер и дату, мы можем обратиться к менеджеру конкретного документа для поиска. Обратите внимание на важный нюанс: в 1С нумерация документов обычно является периодической (в пределах года). Если не указать дату (или указать ее неточно), поиск может вернуть документ за другой год или завершиться ошибкой.


// Поиск документа по номеру с учетом периодичности (даты документа)
НайденныйДокумент = Документы.ОтчетПроизводстваЗаСмену.НайтиПоНомеру(НомерДокумента, ДатаДокумента);

Если НайденныйДокумент.Пустая() Тогда
    Сообщить("Документ с номером " + НомерДокумента + " не найден в информационной базе.");
Иначе
    // Работаем с найденной ссылкой
    ПроводкиДокумента = НайденныйДокумент.ПолучитьОбъект();
КонецЕсли;

---

Ловушка использования ПРЕДСТАВЛЕНИЯ в запросах

Среди разработчиков часто звучит предложение: «Давайте просто напишем запрос к таблице документов и наложим условие через оператор ПОДОБНО на представление документа». Например, использовать конструкцию:

ГДЕ ПРЕДСТАВЛЕНИЕ(Ссылка) ПОДОБНО &СтрокаПоиска

Внимание! Это грубейшая ошибка, которая приведет к сбою программы.

Давайте разберем причину этого ограничения:

  1. Поле Представление является виртуальным полем платформы 1С. Оно не хранится в таблицах СУБД (MS SQL, PostgreSQL и др.) в готовом строковом виде.
  2. Когда выполняется запрос, СУБД оперирует только физическими колонками таблиц. СУБД "не знает", по каким правилам 1С строит строковые представления объектов (какие префиксы обрезает, как форматирует дату и т.д.).
  3. Платформа формирует текстовое представление ссылочного объекта динамически на стороне сервера приложений 1С во время вывода данных пользователю или при получении результатов запроса.
  4. Попытка использовать ПРЕДСТАВЛЕНИЕ в секциях ГДЕ, СГРУППИРОВАТЬ ПО или СОЕДИНЕНИЕ вызовет системную ошибку несовместимости типов на уровне SQL-транслятора.

Если вам обязательно нужно искать документы через запрос (например, когда тип документа заранее неизвестен и обход идет по нескольким таблицам), необходимо передавать в параметры запроса физические реквизиты: Номер и Дата.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Ссылка КАК ДокументСсылка
    |ИЗ
    |	Документ.ОтчетПроизводстваЗаСмену КАК Отчет
    |ГДЕ
    |	Отчет.Номер = &Номер
    |	И Отчет.Дата = &Дата";

Запрос.УстановитьПараметр("Номер", НомерДокумента);
Запрос.УстановитьПараметр("Дата", ДатаДокумента);

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    СсылкаНаДокумент = Выборка.ДокументСсылка;
КонецЕсли;

---

Современные и надежные архитектурные альтернативы парсингу строк

Разработка интеграции на основе парсинга текстовых файлов (строк представлений) — это тупиковый и крайне нестабильный путь. Изменение формата номера (например, добавление префикса организации или подразделения), смена часового пояса сервера или корректировка синонимов объектов моментально ломают такой обмен.

Рассмотрим профессиональные инструменты платформы «1С:Предприятие 8», которые полностью решают проблему сопоставления разнородных данных.

Альтернатива 1. Использование Уникального Идентификатора (UUID/GUID)

Каждая ссылка на любой объект в базе данных 1С (будь то справочник, документ, план счетов или задача) снабжена неизменяемым 128-битным уникальным идентификатором (UUID). Это идеальный ключ для обмена.

Вместо передачи текстового представления "Отчет производства за смену...", выгружайте из базы-источника строковое значение UUID документа:


// В базе-источнике получаем строковый UUID
СтрокаGUID = Строка(ДокументСсылка.УникальныйИдентификатор());
// Результат будет иметь вид: "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d"

В базе-приемнике мы мгновенно восстанавливаем ссылку на объект по его UUID без выполнения тяжелых поисковых запросов к СУБД:


// В базе-приемнике воссоздаем ссылку по UUID
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаДокумент = Документы.ОтчетПроизводстваЗаСмену.ПолучитьСсылку(НовыйGUID);

// Проверяем физическое существование объекта в базе данных
Если СсылкаНаДокумент.ПолучитьОбъект() = Неопределено Тогда
    Сообщить("Документ еще не был загружен в базу-приемник!");
Иначе
    Сообщить("Документ успешно найден по UUID!");
КонецЕсли;

Метод ПолучитьСсылку() работает чрезвычайно быстро, так как он не делает обращений к базе данных в момент вызова, а лишь генерирует ссылку в оперативной памяти.

Альтернатива 2. Сериализация в формат JSON или XML

Для обмена текстовыми файлами вместо создания собственных велосипедов по сборке строк (например, ИмяРеквизита + ЗначениеРеквизита + Метаданные...) используйте стандартные механизмы сериализации данных 1С.

Сериализатор XDTO или встроенные функции работы с JSON позволяют превратить любой объект 1С (включая документы со всеми реквизитами и табличными частями) в структурированный текстовый файл одной строчкой кода:


// Сериализация документа в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДокументСсылка);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Строку JSON теперь можно безопасно передать через txt-файл или Web-сервис

При чтении на стороне приемника платформа автоматически восстановит типы данных, структуру реквизитов и связей.

Альтернатива 3. Таблицы сопоставления (Регистры сведений)

Если обмен данными производится с внешней информационной системой (например, сайтом на CMS Битрикс, ERP-системой SAP или CRM), где физически нет понятия "UUID 1С", правильным архитектурным решением является проектирование Регистра сведений "СопоставлениеОбъектов".

Структура регистра может выглядеть следующим образом:

При получении текстового файла из внешней системы поиск будет сводиться к быстрому точечному запросу к этому регистру сведений по индексу измерения ИДВнешнейСистемы, что исключит необходимость парсить синонимы, даты и номера документов.

← На главную