При работе с платформой 1С:Предприятие, особенно при использовании Системы Компоновки Данных (СКД) в расширениях, обработке результатов запросов и выборе подходящих структур данных, мы часто сталкиваемся с неочевидными моментами. В этой статье мы подробно разберем типичные проблемы и предложим эффективные решения, чтобы ваш код работал стабильно и предсказуемо.
Работая с отчетами на СКД, которые реализованы в расширениях конфигурации 1С, мы можем столкнуться с ситуацией, когда параметры или даже целые структуры данных, добавленные в расширении, не "видятся" конструктором запросов или СКД в конфигураторе. Давайте выясним, почему это происходит и как это обойти.
Основная причина кроется в том, что конфигуратор в режиме разработки расширения не всегда полностью интегрирует новые объекты расширения с основной конфигурацией для целей построения запросов и схем СКД. Это может приводить к тому, что при попытке установить параметр или использовать новое поле, система его просто не находит.
Рассмотрим несколько подходов, которые помогут нам решить эту проблему:
Формирование запроса/схемы СКД в режиме 1С:Предприятие. Это один из самых надежных способов. Мы можем:
Сформировать текст запроса или всю схему СКД в режиме 1С:Предприятие, используя специализированные инструменты, такие как консоль запросов или консоль СКД. Эти инструменты работают в контексте уже запущенного приложения, где расширение полностью активно и все его объекты доступны. Полученный готовый запрос или схема затем вставляется непосредственно в код отчета расширения.
Заимствование необходимых объектов. В некоторых случаях можно заимствовать все необходимые объекты из основной конфигурации в расширение. Однако, этот подход может усложнить процесс обновления конфигурации, так как изменения в заимствованных объектах основной конфигурации могут потребовать ручной синхронизации в расширении.
Программная установка параметров. Мы часто устанавливаем параметры СКД программно перед формированием отчета. Для этого обычно используется процедура ПередФормированиемОтчета. Ключевым моментом здесь является убедиться, что свойство Использование параметра установлено в Истина. Если оно не установлено, параметр может быть проигнорирован.
Посмотрим на пример установки параметра:
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("МойПараметр", ЗначениеПараметра);
КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиПараметр("МойПараметр").Использование = Истина;
Параметр со свойством "Всегда". Если свойство Использование параметра установлено в "Всегда" (в конфигураторе) и при этом отмечен флаг "Запрещать незаполненные значения", система будет принудительно требовать значение параметра. Это может быть полезно, но также может привести к ошибкам, если значение не будет предоставлено.
Отладка с помощью консолей компоновки данных. Для выявления причин некорректной работы параметров СКД в расширениях мы настоятельно рекомендуем использовать консоли компоновки данных. Они позволяют нам:
Это помогает нам точно определить, почему параметр не применяется или почему он получает некорректное значение.
После выполнения запроса к базе данных 1С, мы получаем объект РезультатЗапроса. Теперь нам необходимо правильно обработать эти данные. Разберем два основных сценария:
Проверка на наличие данных без обхода.
Если нам нужно просто узнать, вернул ли запрос хотя бы одну строку, но без необходимости перебирать все данные, наиболее эффективным способом является использование метода РезультатЗапроса.Пустой(). Этот метод вернет Истина, если запрос не вернул ни одной строки, и Ложь в противном случае.
Если РезультатЗапроса.Пустой() Тогда
// Запрос не вернул данных
Сообщить("Данные по запросу отсутствуют.");
Иначе
// Данные есть, можно приступать к их обработке
КонецЕсли;
Последовательная обработка всех строк выборки.
Когда нам требуется последовательно обработать каждую строку результата запроса, стандартный и рекомендованный подход — это получение выборки и последующий обход с помощью цикла. Мы получаем выборку методом РезультатЗапроса.Выбрать(), а затем используем цикл Пока Выборка.Следующий() Цикл ... КонецЦикла;.
В этом случае предварительная проверка на Пустой() становится избыточной, так как метод Выборка.Следующий() сам по себе вернет Ложь, если больше нет строк для обхода, или если выборка изначально пуста. Но очень важно инициализировать переменные, которые мы планируем получить из выборки, до начала цикла или до проверки Выборка.Следующий().
Посмотрим на пример из обсуждения, как правильно обработать выборку и инициализировать переменную, если данных нет:
Выборка = РезультатЗапроса.Выбрать();
// Инициализируем переменную до попытки чтения из выборки.
// Это гарантирует, что переменная всегда будет иметь значение,
// даже если выборка окажется пустой.
СуммаЗадолженности = 0;
Если Выборка.Следующий() Тогда
СуммаЗадолженности = Выборка.Сумма;
Иначе
// Здесь мы уже установили СуммаЗадолженности = 0
// Если бы не было инициализации, здесь бы пришлось явно задавать
// СуммаЗадолженности = 0;
Сообщить("По этому контрагенту информация о задолженности отсутствует.");
КонецЕсли;
В этом примере мы видим, как важно заранее присвоить переменной СуммаЗадолженности значение по умолчанию (например, 0), чтобы избежать ошибок, если запрос не вернет данных. Метод Выборка.Следующий() перемещает нас на следующую строку и возвращает Истина, если строка существует, или Ложь, если строк больше нет.
При проектировании учета в 1С одним из ключевых решений является выбор подходящего типа регистра для хранения данных. В контексте учета взаиморасчетов, таких как задолженность с контрагентами, мы часто сталкиваемся с вопросом: что использовать – РегистрСведений или РегистрНакопления?
Давайте выясним причину, по которой для учета взаиморасчетов следует использовать РегистрНакопления с видом "Остатки".
Назначение Регистров Накопления.
РегистрыНакопления в 1С предназначены для учета движения средств, товаров, материалов и, конечно же, взаиморасчетов. Они бывают двух видов:
Для задач, связанных с учетом текущего состояния расчетов с контрагентами, таких как задолженность, нам необходима возможность оперативно получать информацию об остатках на любую дату. Именно РегистрНакопления с видом "Остатки" идеально подходит для этой цели, так как он обеспечивает автоматический расчет итогов и остатков.
Назначение Регистров Сведений.
РегистрыСведений, в отличие от регистров накопления, предназначены для хранения периодической или непериодической информации, не связанной напрямую с движением или накоплением. Примеры использования: курсы валют, контактная информация, цены номенклатуры, настройки пользователей. Они хранят записи как "срез" данных на определенный момент или просто набор информации.
РегистрСведений не обеспечивает автоматического расчета итогов и остатков, как это делают регистры накопления. Если мы попытаемся использовать РегистрСведений.ОстаткиВзаиморасчетов для учета задолженности, нам придется самостоятельно реализовывать сложную логику расчета остатков на каждую дату, что является избыточным и неэффективным решением, поскольку платформа уже предоставляет специализированный механизм для этого.
Таким образом, для надежного и эффективного учета задолженности и других взаиморасчетов мы должны использовать РегистрНакопления с видом "Остатки". Это соответствует архитектуре платформы 1С и позволяет использовать все ее преимущества для работы с учетными данными.