Как динамически создавать объекты и формировать запросы из переменных в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Динамическое создание объекта через метод СоздатьОбъект

Рассмотрим ситуацию, когда мы получаем вид документа из списка значений или иного источника данных. Типичная ошибка начинающего разработчика заключается в избыточном использовании кавычек. Проанализируем пример: если мы хотим создать объект «Документ.ЗаявкаПокупателя», методу СоздатьОбъект нужно передать строку. Если в самой строке будут содержаться лишние символы кавычек, система выдаст ошибку «Неудачная попытка создания объекта».

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

Посмотрим на корректный пример кода:


// Предположим, ВыбранныйДок содержит строку "ЗаявкаПокупателя"
ВидДока = "Документ." + ВыбранныйДок;
Док = СоздатьОбъект(ВидДока);
// Теперь объект Док успешно инициализирован

Или еще более лаконичный вариант, когда подстановка идет прямо в параметре метода:


Док = СоздатьОбъект("Документ." + ВыбДок.ПолучитьЗначение(ВыбДок.ТекущаяСтрока()));

Формирование динамического текста запроса

После создания объекта часто требуется выбрать данные с помощью внутреннего языка запросов 1С 7.7. Проблема здесь в том, что текст запроса — это обычная строка, и если мы просто напишем имя переменной внутри кавычек, запрос воспримет это как литерал, а не как значение переменной. Разберем, как правильно «собрать» текст запроса.

Проанализируем первый способ — прямая конкатенация строк. Мы разрываем строку запроса в местах, где должно стоять имя документа, и вставляем переменную:


ТекстЗапроса = "
|Период С НачДата По КонДата;
|ТекущийЭлемент = Документ." + ВыбранныйДок + ".ТекущийДокумент;
|Фирма = Документ." + ВыбранныйДок + ".Фирма;
|ДатаДок = Документ." + ВыбранныйДок + ".ДатаДок;
|Группировка ТекущийЭлемент;
|Условие (Фирма = ВыбФирм);
|";

Обратите внимание на важный нюанс: в строке |ТекущийЭлемент = Документ." + ВыбранныйДок + ".ТекущийДокумент; мы обращаемся к конкретному виду метаданных. Это позволяет нам в дальнейшем обращаться к реквизитам этого документа (например, Фирма).

Использование функции СтрЗаменить для чистоты кода

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

  1. Пишем текст запроса, используя уникальный маркер (например, %ВидДок%).
  2. Заменяем маркер на реальное значение переменной.

ТекстЗапроса = "
|Период С НачДата По КонДата;
|ТекДок = Документ.%ВидДок%.ТекущийДокумент;
|Фирма = Документ.%ВидДок%.Фирма;
|Группировка ТекДок;
|Условие (Фирма = ВыбФирм);
|";

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ВидДок%", ВыбранныйДок);

Применение функции Шаблон для динамических строк

В 1С 7.7 существует очень удобная, но часто забываемая функция Шаблон. Она позволяет вычислять выражения, заключенные в квадратные скобки, прямо внутри строки. Это делает формирование динамических запросов максимально изящным.

Разберем пример использования Шаблон:


// В переменной ВыбранныйДок лежит "Реализация"
ТекстЗапроса = Шаблон("|ТекущийЭлемент = Документ.[ВыбранныйДок].ТекущийДокумент;");
// На выходе получим: |ТекущийЭлемент = Документ.Реализация.ТекущийДокумент;

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

Важные технические нюансы при работе с запросами

Работая с динамическими запросами, стоит помнить о нескольких правилах платформы 7.7:

Обработка ошибок при создании объектов

Для того чтобы ваша программа не «вылетала» при ошибке (например, если пользователь ввел некорректное имя), рекомендуется использовать конструкцию Попытка...Исключение. Это обеспечит отказоустойчивость приложения.


Попытка
    Док = СоздатьОбъект("Документ." + ВыбранныйДок);
Исключение
    Сообщить("Ошибка: Вид документа '" + ВыбранныйДок + "' не найден в конфигурации!");
    Возврат;
КонецПопытки;

Подводя итог, можно сказать, что динамическая работа с метаданными в 1С 7.7 требует аккуратности в обращении со строками. Использование функций СтрЗаменить или Шаблон значительно повышает читаемость кода по сравнению с обычной конкатенацией, а понимание механизмов работы запроса позволяет оптимизировать выборку данных.

← На главную