Неверное количество параметров при использовании шаблона 1с
Используя метод СтрШаблон в 1С легко ошибиться, и последствия данных ошибок могут быть как незначительными, так и критическими.
Команда SilverBulleters
Функция СтрШаблон крайне полезная функция, которая появилась в платформе 1С: Предприятие начиная с версии 8.3.6. Она позволяет удобно сформировать строку подставляя переменное количество параметров.
В данном примере результирующей строкой будет Ошибка в данных в строке 2 (требуется тип Дата) .
Однако, при использовании данной функции легко ошибиться, и последствия данных ошибок могут быть как незначительными, так и критическими.
Одной из самых распространенных ошибок является некорректное использование функции НСтр внутри СтрШаблон :
В примере выше, разработчик "промахнулся" при указании параметров метода. Вместо того чтобы указать параметр ИмяПартнера как параметр СтрШаблон , он указал его как параметр НСтр . В результате данный вызов отработает и вернет пустую строку, что не то, что ожидает увидеть пользователь при выяснении причины ошибки. Однако данная ошибка является информационной, так как не нарушает работу программы.
Куда хуже, когда разработчик некорректно описывает сам шаблон, как например:
Что же тут произошло? Разработчик неправильно указал параметр шаблона, указав просто знак процента, тогда как корректно было бы %1 . В результате исполнения данного кода возникнет исключение времени выполнения Ошибка синтаксиса шаблона , что уже является блокирующей ошибкой, которая помешает полноценной работе пользователя.
Здесь разработчик либо забыл добавить необходимый параметр в шаблон, либо забыл убрать само значение параметра. В результате 1С отреагирует исключением времени выполнения "Слишком много фактических параметров", что также заблокирует нормальную работу пользователя.
Как этого можно было избежать:
- внимательно читать документацию к методу СтрШаблон , в которой подробно описаны ситуации при которых 1С будет генерировать исключения;
- тщательно тестировать свои доработки/исправления. Даже если у вас нет автотестов или QA, разработчик не должен лениться самостоятельно запустить и проверить свою доработку;
- использование статических анализаторов/линтеров, которые могут в автоматическом режиме проверить корректность шаблона и предупредить разработчика о возможных последствиях.
Sign up for more like this.
Уязвимость в библиотеке Log4j в экосистеме Java
Как обезопасить себя от уязвимости CVE-2021-44228, исходящей из библиотеки log4j 2
Знакомство с КафкаКоннектор версии 1.0
Новый взгляд на организацию обмена данными 1С с использованием Apache Kafka
В дополнение к статической системе разделения прав доступа (на основании ролей) в системе 1С действует вторая система прав доступа — динамическая (RLS). В этой системе права доступа высчитываются динамических способом, в зависимости от заданных параметров, в процессе работы.
Правила распределения прав доступа в системе RLS описываются в шаблонах, которые описываются на языке запросов 1С с использованием специального расширенного синтаксиса. При этом текст шаблона может быть весьма сложным для понимания и отладки.
Мы столкнулись с необходимостью добиться правильной работы шаблона ограничений прав в конфигурации "Бухгалтерия предприятия, редакция 3.0". Проблема заключалась в том, что разделение прав по организациям для штатных ролей конфигурации работало правильно, а для тех ролей, которые добавили мы - не работало вовсе.
Мы попробовали воспользоваться обработкой //infostart.me/public/264989/ , однако с нашим шаблоном она не справилась - некоторые синтаксические конструкции не поддерживались. В исследуемом шаблоне было:
- 52 параметра;
- встроенные предопределённые шаблоны;
- параметры сеанса;
- функциональные опции;
- многочисленные инструкции препроцессора, в том числе вложенные;
- просто около 3000 строк.
В результате ограничение прав доступа было абсолютно нечитабельно, понять, что именно на рабочей базе было настроено не так, как настроено на тестовой, где всё работало, не удавалось.
Возникла идея написать обработку, которая организует препроцессинг ограничения прав доступа, показывая запрос, который в конце концов применяет 1С. В ограничениях прав доступа могут быть:
Для использования реализованной обработки необходимо:
- Выгрузить файлы конфигурации. (Конфигуратор -> Главное меню -> Конфигурация -> Выгрузить файлы конфигурации. )
- Запустить обработку в режиме предприятия.
- Последовательно указать: Файл прав (Файл сохранённой роли), Объект прав (Полное имя таблицы или реквизита), Имя права (Обычно чтение).
- Проверить настройки: Имя текущей таблицы, имя текущего права доступа, текущая таблицы. Они должны заполниться автоматически.
- Нажать кнопку "Выполнить".
- После выполнения пункта 5) должна заполниться таблица параметров. Если в ограничении прав доступа использовались подстроки &Параметр, то они должны появиться в таблице Параметры.
- В теории 1С допускает наличие отдельного ограничения доступа для каждого реквизита (поля). Поэтому результат будет показан в виде списка полей. При активации элемента списка автоматически заполняется текстовый документ - результатируещей строкой запроса.
- Обработка позволяет менять значения параметров и настроек. После этого можно снова нажимать кнопку "Выполнить".
В результате получаем гораздо более читабельный текст, который можно использовать в конструкторе запросов ограничения доступа или, с минимальными довольно очевидными изменениями, его можно выполнить в консоли запросов.
<(34, 11)>: Синтаксическая ошибка ":"
Ошибка>: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 17 шаблона ограничения доступа ПоЗначениям. Объект: "Документ.ПередачаМатериаловВЭксплуатацию", Право: "Чтение".
:Результат = Запрос.Выполнить();
: ЗаполнитьНаСервере();
по причине:
Ошибка выполнения запроса
по причине:
Ошибка в ограничении доступа к данным.
объект: 'Документ.ПередачаМатериаловВЭксплуатацию', поле: 'Ссылка'; право: 'Чтение'
<(34, 11)>: Синтаксическая ошибка ":"
Ошибка>: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 17 шаблона ограничения доступа ПоЗначениям. Объект: "Документ.ПередачаМатериаловВЭксплуатацию", Право: "Чтение".
по причине:
<(34, 11)>: Синтаксическая ошибка ":"
Ошибка>: Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа по причине: Используется устаревшая версия 17 шаблона ограничения доступа ПоЗначениям. Объект: "Документ.ПередачаМатериаловВЭксплуатацию", Право: "Чтение".
И роли и документы на замке. Что нужно делать?
Добавлено:
Проблема была в расширении. Автор выложил новую версию. Потребовал её ещё раз купить.
Если Валюта1.КурсЧислитель <> 0
И Валюта1.КурсЗнаменатель <> 0
И Валюта2.КурсЧислитель <> 0
И Валюта2.КурсЗнаменатель <> 0 Тогда
ЧислительПриведенный = Валюта1.КурсЧислитель * Валюта2.КурсЗнаменатель / (Валюта2.КурсЧислитель * Валюта1.КурсЗнаменатель);
ЗнаменательПриведенный = 1;
Если ЧислительПриведенный < 1 Тогда
Пока ЧислительПриведенный * 10 < 1 Цикл
ЧислительПриведенный = ЧислительПриведенный * 10;
ЗнаменательПриведенный = ЗнаменательПриведенный * 10;
КонецЦикла;
КонецЕсли;
Иначе
ЧислительПриведенный = 1;
ЗнаменательПриведенный = 1;
КонецЕсли;
СтруктураКурса = СтруктураКурсаВалюты();
СтруктураКурса.КурсЧислитель = Окр(ЧислительПриведенный, Точность);
СтруктураКурса.КурсЗнаменатель = ЗнаменательПриведенный;
В процессе обновления информационной базы произошла критическая ошибка
по причине:
Ошибка СУБД:
Ошибка SQL: Таблица не найдена 'SchemaStorage'
по причине:
Ошибка SQL: Таблица не найдена 'SchemaStorage
Параметр в 1С – это некий элемент, принятый функцией. В данной статье поговорим о видах и типах параметров, а также рассмотрим, как задать параметры так, чтобы избежать ошибки «Неверные параметры» в 1С.
1. Как установить параметр в запросе?
Параметр запроса – это некоторый элемент, который находится внутри функции поиска по базе данных. Рассмотрим пример, как должны быть установлены параметры запроса. Например, пускай нам нужно получить составляющие из перечня-справочника под названием «Еда» красного, жёлтого или зелёного цвета, это будет иметь такой вид:
Рис. 1 Как установить параметр в запросе «Красный»
Рис. 2 Как установить параметр в запросе «Желтый»
Рис. 3 Как установить параметр в запросе «Зеленый»
Можно увидеть, что, по факту, все эти запросы одинаковые и разность только в цвете. Это-то и есть наш параметр – та переменная, которую не хотелось бы каждый раз повторять. В вышеуказанном примере параметр – это цвет, дадим ему имя «ВыбранныйЦвет» и поменяем значения цветов на эту переменную внутри запроса. А для того чтобы указать, что это именно параметр, нужно приписать перед именем амперсанд «&», тогда мы сможем задать параметр в запросе:
Рис. 4 Как задать параметр в запросе «ВыбранныйЦвет»
После этой процедуры пробуем выполнить наш запрос, результат будет пустым и выглядеть так:
Рис. 5 Результат неверного параметра в запросе пустой
Результат запроса пустой по причине того, что в коде не было указано само значение параметра. Выберем имя, для этого потребуется задействовать панель, которая находится над редактором запросов. Внутри данной панели размещен текст запросов:
Рис. 6 Редактор запросов – панель с текстом запросов
Система 1С уже узнала параметр внутри запроса и выделила его в соответствующей секции, но пока без значений. Меняем пустое значение запроса, например, на значение «Жёлтый».
Рис. 7 Смена пустого значения запроса на «Желтый»
Теперь запрос выполнится! Аналогично можно заполнить оставшиеся значения. Так при помощи параметра можно в одном и том же запросе получать результаты, которые отличаются. То есть, главная функция параметров внутри запросов – делать их более обобщёнными. Это особенно актуально в сложных запросах, так как достаточно будет только изменить сам параметр, не меняя весь запрос.
2. Функция параметра «Ссылка»
В этом варианте будет сравниваться в качестве ограничения для параметра не название цвета, а значение по ссылке:
Рис. 8 Ограничение для параметра – значение по ссылке
Наш параметр «ВыбранныйЦвет» из строки превратился в ссылку на какой-то элемент внутри справочника «Цвета», поэтому у пользователя есть возможность изменить параметр и его тип:
Рис. 9 Изменения типа параметра в 1С
После этого, в момент, когда ведётся выбор значения данного параметра, перед нами появится выпадающий список с перечнем цветов – это функция параметра ссылки.
3. Параметр «Дата»
Допустим, нужен запрос, который будет выбирать заказы клиентов в определённый период. Данный период будет иметь две границы – «НачалоИнтервала» и «КонецИнтервала».
Рис. 10 Параметр «Дата»
Аналогично выполняем данный запрос и видим, что 1С уже распознала, что у данного параметра тип «Дата». Пусть нам нужны заказы за январь 2014 года, тогда получим:
Рис. 11 Пример запроса по параметру «Дата»
Результат запроса с параметром «Дата» будет выглядеть следующим образом:
Рис. 12 Результат запроса с параметром «Дата»
В данной статье были рассмотрены параметры в системе 1С, видов параметр внутри запроса, параметр с типом «Дата», параметры с типом «Ссылка», аналогично проводится работа с параметрами в списках таблиц и таблиц со значениями. Ошибка в них возникает в случае задания невозможного названия, типа, их несоответствий, пунктуационных ошибок в коде программы.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Читайте также: