Как правильно написать обращение к счету, проверку типа субконто и параметры периода в запросе 1С?

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

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

1. Обращение к предопределенному счету: конструкция ЗНАЧЕНИЕ

В языке запросов 1С нельзя обращаться к объектам метаданных через точку так же, как во встроенном языке (например, ПланСчетов.Хозрасчетный.МатериалыПереданныеВПереработку). Для прямого обращения к предопределенным элементам конфигурации на этапе компиляции запроса предназначена специальная конструкция ЗНАЧЕНИЕ(...).

Рассмотрим синтаксис обращения к счету плана счетов:

Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.МатериалыПереданныеВПереработку)

Конструкция ЗНАЧЕНИЕ() работает только со статическими объектами метаданных (предопределенные элементы справочников, планов счетов, значения перечислений и пустые ссылки). Если счет или субконто не являются предопределенными и создаются пользователями в режиме предприятия, их необходимо передавать в запрос через параметры с амперсандом: Счет = &НужныйСчет.

2. Проверка типа субконто: оператор ССЫЛКА

Поля субконто в регистре бухгалтерии имеют составной тип данных, так как на одном счете могут учитываться договоры, контрагенты, номенклатура или различные виды документов. Когда необходимо отобрать движения, где субконто заполнено документом определенного вида (например, Документ.ПоступлениеИзПереработки), используется оператор ССЫЛКА.

Посмотрим на пример проверки типа поля субконто:

Субконто2 ССЫЛКА Документ.ПоступлениеИзПереработки

Если в дальнейшем потребуется получить реквизиты этого документа через точку (например, склад или контрагента), важно использовать явное приведение типов с помощью функции ВЫРАЗИТЬ, чтобы избежать избыточных неявных левых соединений со всеми возможными таблицами составного типа:


ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто2 КАК Документ.ПоступлениеИзПереработки).Контрагент

3. Передача дат в виртуальные таблицы и ошибка «Поле не найдено»

При указании периода в параметрах виртуальных таблиц регистра бухгалтерии (таких как Обороты или ОстаткиИОбороты) часто допускается ошибка: имя параметра пишется без знака амперсанда (&). В этом случае СУБД воспринимает переданное слово как имя поля базы данных и выдает ошибку «Поле не найдено».

Разберем правильный синтаксис параметров виртуальной таблицы:

  1. Параметры, передаваемые из встроенного языка, всегда должны предваряться знаком &: &НачПериода, &КонПериода.
  2. Для корректного включения всего последнего дня периода в выборку рекомендуется использовать функцию запроса КОНЕЦПЕРИОДА().

РегистрБухгалтерии.Хозрасчетный.Обороты(
    &НачПериода,
    КОНЕЦПЕРИОДА(&КонПериода, ДЕНЬ),
    ,
    Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.МатериалыПереданныеВПереработку)
        И Субконто2 ССЫЛКА Документ.ПоступлениеИзПереработки
)

4. Оптимизация: наложение условий в параметрах виртуальной таблицы

Проанализируем важный аспект производительности. Условия по счету и видам субконто всегда следует накладывать внутри круглых скобок параметров виртуальной таблицы, а не в секции ГДЕ запроса.

Если наложить фильтр в секции ГДЕ, платформа сначала рассчитает итоги по абсолютно всем счетам регистра, создаст временную таблицу и только потом отфильтрует данные. Передача условий в параметры виртуальной таблицы заставляет СУБД считывать только нужные записи, что ускоряет выполнение запроса в десятки раз.

Комплексный пример запроса и установки параметров в коде 1С

Объединим все разобранные элементы в законченный рабочий пример кода на встроенном языке 1С:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ХозрасчетныйОбороты.Субконто1 КАК Номенклатура,
    |	ХозрасчетныйОбороты.Субконто2 КАК ДокументПартии,
    |	ХозрасчетныйОбороты.КоличествоОборотДт КАК КоличествоДт,
    |	ХозрасчетныйОбороты.СуммаОборотДт КАК СуммаДт
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.Обороты(
    |		&НачПериода,
    |		КОНЕЦПЕРИОДА(&КонПериода, ДЕНЬ),
    |		Авто,
    |		Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.МатериалыПереданныеВПереработку)
    |			И Субконто2 ССЫЛКА Документ.ПоступлениеИзПереработки,
    |		,
    |		
    |	) КАК ХозрасчетныйОбороты";

Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонПериода", КонецМесяца(ТекущаяДата()));

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

Пока Выборка.Следующий() Цикл
    // Обработка полученных данных
КонецЦикла;
← На главную