В процессе разработки на платформе 1С:Предприятие 7.7 часто возникают задачи, когда имя объекта (например, вид документа или справочника) заранее неизвестно и определяется пользователем в режиме «Предприятие». В таких случаях программисту необходимо уметь правильно манипулировать строковыми переменными для создания агрегатных объектов и написания текстов запросов. В этой статье мы подробно разберем, как избежать типичных ошибок при работе с динамическими именами метаданных.
Рассмотрим ситуацию, когда мы получаем вид документа из списка значений или иного источника данных. Типичная ошибка начинающего разработчика заключается в избыточном использовании кавычек. Проанализируем пример: если мы хотим создать объект «Документ.ЗаявкаПокупателя», методу СоздатьОбъект нужно передать строку. Если в самой строке будут содержаться лишние символы кавычек, система выдаст ошибку «Неудачная попытка создания объекта».
Выясним причину: когда вы пишете """Документ." + Имя + """", результирующая строка буквально содержит кавычки внутри себя, что недопустимо для идентификатора метаданных. Правильный подход заключается в простой конкатенации строк без лишнего экранирования.
Посмотрим на корректный пример кода:
// Предположим, ВыбранныйДок содержит строку "ЗаявкаПокупателя"
ВидДока = "Документ." + ВыбранныйДок;
Док = СоздатьОбъект(ВидДока);
// Теперь объект Док успешно инициализирован
Или еще более лаконичный вариант, когда подстановка идет прямо в параметре метода:
Док = СоздатьОбъект("Документ." + ВыбДок.ПолучитьЗначение(ВыбДок.ТекущаяСтрока()));
После создания объекта часто требуется выбрать данные с помощью внутреннего языка запросов 1С 7.7. Проблема здесь в том, что текст запроса — это обычная строка, и если мы просто напишем имя переменной внутри кавычек, запрос воспримет это как литерал, а не как значение переменной. Разберем, как правильно «собрать» текст запроса.
Проанализируем первый способ — прямая конкатенация строк. Мы разрываем строку запроса в местах, где должно стоять имя документа, и вставляем переменную:
ТекстЗапроса = "
|Период С НачДата По КонДата;
|ТекущийЭлемент = Документ." + ВыбранныйДок + ".ТекущийДокумент;
|Фирма = Документ." + ВыбранныйДок + ".Фирма;
|ДатаДок = Документ." + ВыбранныйДок + ".ДатаДок;
|Группировка ТекущийЭлемент;
|Условие (Фирма = ВыбФирм);
|";
Обратите внимание на важный нюанс: в строке |ТекущийЭлемент = Документ." + ВыбранныйДок + ".ТекущийДокумент; мы обращаемся к конкретному виду метаданных. Это позволяет нам в дальнейшем обращаться к реквизитам этого документа (например, Фирма).
Если текст запроса большой, конкатенация через «+» делает код трудночитаемым. Профессиональнее использовать метод «подстановочных знаков» (маркеров) и функцию СтрЗаменить. Рассмотрим этот метод подробнее:
%ВидДок%).
ТекстЗапроса = "
|Период С НачДата По КонДата;
|ТекДок = Документ.%ВидДок%.ТекущийДокумент;
|Фирма = Документ.%ВидДок%.Фирма;
|Группировка ТекДок;
|Условие (Фирма = ВыбФирм);
|";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ВидДок%", ВыбранныйДок);
В 1С 7.7 существует очень удобная, но часто забываемая функция Шаблон. Она позволяет вычислять выражения, заключенные в квадратные скобки, прямо внутри строки. Это делает формирование динамических запросов максимально изящным.
Разберем пример использования Шаблон:
// В переменной ВыбранныйДок лежит "Реализация"
ТекстЗапроса = Шаблон("|ТекущийЭлемент = Документ.[ВыбранныйДок].ТекущийДокумент;");
// На выходе получим: |ТекущийЭлемент = Документ.Реализация.ТекущийДокумент;
Использование этого метода позволяет избежать путаницы с кавычками и плюсами, сохраняя структуру запроса наглядной.
Работая с динамическими запросами, стоит помнить о нескольких правилах платформы 7.7:
|Группировка Документ; (или ТекущийЭлемент) по умолчанию упорядочивает выборку по хронологии (дата + время + позиция в акте). Поэтому использование конструкции упорядочить по ТекущийЭлемент.ДатаДок часто является избыточным и может замедлять выполнение.Документ.Имя.Реквизит сработает только если этот реквизит действительно существует в данном виде документа. Если нужно выбрать данные по всем документам сразу, используйте Документ.ТекущийДокумент, но доступ к специфическим реквизитам (вроде «Склад» или «Фирма») придется реализовывать через дополнительные проверки или группировки.Метаданные: Метаданные.Документ(ВыбранныйДок).Выбран().Для того чтобы ваша программа не «вылетала» при ошибке (например, если пользователь ввел некорректное имя), рекомендуется использовать конструкцию Попытка...Исключение. Это обеспечит отказоустойчивость приложения.
Попытка
Док = СоздатьОбъект("Документ." + ВыбранныйДок);
Исключение
Сообщить("Ошибка: Вид документа '" + ВыбранныйДок + "' не найден в конфигурации!");
Возврат;
КонецПопытки;
Подводя итог, можно сказать, что динамическая работа с метаданными в 1С 7.7 требует аккуратности в обращении со строками. Использование функций СтрЗаменить или Шаблон значительно повышает читаемость кода по сравнению с обычной конкатенацией, а понимание механизмов работы запроса позволяет оптимизировать выборку данных.