Как объединить дату и номер документа в одну строку в запросе 1С

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

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

Вариант 1: «Хакерский» метод с использованием ПОДСТРОКА

Существует способ объединения данных непосредственно в тексте запроса. Он основан на разбиении даты на составляющие (день, месяц, год) с помощью функций ДЕНЬ(), МЕСЯЦ(), ГОД(), преобразовании их в строки через математические операции и последующем склеивании. Однако этот метод крайне сложен в поддержке и написании.

Рассмотрим пример того, как это выглядит в запросе:


ВЫБРАТЬ
    "№" + Поступление.НомерВходящегоДокумента + " от " + 
    ПОДСТРОКА("0123456789", ДЕНЬ(Поступление.ДатаВходящегоДокумента) / 10 + 1, 1) + 
    ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, 6 * ДЕНЬ(Поступление.ДатаВходящегоДокумента))) / 6 + 1, 1) + "/" + ... 
    КАК Основание
ИЗ 
    Документ.ПоступлениеТоваровУслуг КАК Поступление

Важно: Данный метод является «извращенным» и рекомендуется к использованию только в крайних случаях, когда нет возможности изменить код обработки данных в модуле.

Вариант 2: Оптимальный подход через программную обработку (Рекомендуемый)

Самый эффективный, быстрый и читаемый способ — это получение исходных данных (номера и даты) в отдельные колонки в запросе, а затем их объединение средствами языка программирования 1С. Это избавляет от необходимости «городить огород» из сложных функций в запросе.

Давайте разберем этот процесс по шагам:

  1. Выбираем номер и дату как отдельные поля в запросе.
  2. Выполняем запрос и получаем результат в виде РезультатЗапроса.
  3. Обходим результат циклами Выбрать() или Выгрузить().
  4. Формируем итоговую строку, используя метод Формат().

Пример реализации в коде модуля:


// В тексте запроса просто выбираем поля без преобразований
Запрос.Текст = "ВЫБРАТЬ
               | Т.Сделка,
               | Т.НомерВходящегоДокумента,
               | Т.ДатаВходящегоДокумента
               |ИЗ ВТ_Таблица КАК Т";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ТекСтрока = Объект.Проекты.Добавить();
    ЗаполнитьЗначенияСвойств(ТекСтрока, Выборка);
    
    // Формируем описание программно
    Если ЗначениеЗаполнено(Выборка.НомерВходящегоДокумента) И ЗначениеЗаполнено(Выборка.ДатаВходящегоДокумента) Тогда
        ТекСтрока.Описание = "№" + Формат(Выборка.НомерВходящегоДокумента, "ЧГ=0") 
                            + " от " + Формат(Выборка.ДатаВходящегоДокумента, "ДЛФ=D");
    КонецЕсли;
КонецЦикла;

Почему лучше использовать программный подход?

Рассмотрим преимущества данного метода:

Если данные в запросе не отображаются, первым делом проверьте, не являются ли исходные поля НомерВходящегоДокумента и ДатаВходящегоДокумента пустыми значениями. Всегда полезно вывести их в отдельные колонки для предварительного контроля перед объединением в итоговую строку.

Если вы используете СКД, то подобную задачу можно решить через Вычисляемые поля, где выражение будет выглядеть гораздо проще, чем в классическом запросе, благодаря встроенным функциям преобразования типов 1С.

← На главную