Ошибка метода контекста

Ошибка в передачи параметра РегистрСведений.Выбрать()

РегистрСведенийМенеджер.<Имя регистра сведений> (InformationRegisterManager.<Имя регистра сведений>) Выбрать (Select) Вариант синтаксиса: Для периодического регистраСинтаксис:
Выбрать(<НачалоИнтервала>, <КонецИнтервала>, <Отбор>, <Порядок>)
Параметры:
<НачалоИнтервала> (необязательный)Тип: Дата; МоментВремени; Граница. Начало интервала, за который будут выдаваться записи периодического регистра сведений. Если не указан, то будут выдаваться записи с самого ранней включительно. Может задаваться значениями типа Дата, МоментВремени или Граница.
<КонецИнтервала> (необязательный) Тип: Дата; МоментВремени; Граница. Конец интервала, за который будут выдаваться записи периодического регистра сведений. Если не указан, то будут выдаваться записи до самой поздней включительно. Может задаваться значениями типа Дата, МоментВремени или Граница. <Отбор> (необязательный)
Тип: Структура. Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться измерения или реквизиты, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или установлен признак «Ведущее». Вид сравнения может быть только Равно.
Важно! Структура может содержать только один элемент.
Если параметр не указан, то отбор не используется.
<Порядок> (необязательный)Тип: Строка. Может содержать слово «Возр» или «Убыв», тогда стандартный порядок будет использоваться с указанным направлением.
Может содержать имя поля (реквизита или измерения, для которых указано индексирование) и слово «Возр» или «Убыв», тогда упорядочивание будет производится по указанному полю в указанном порядке.
Значение по умолчанию: «Возр» Вариант синтаксиса: Для непериодического регистра
Синтаксис:
Выбрать(<Отбор>, <Порядок>)
Параметры:
<Отбор> (необязательный)
Тип: Структура. Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться измерения или реквизиты, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или установлен признак «Ведущее».
Важно! Структура может содержать только один элемент.
Если параметр не указан, то отбор не используется.
<Порядок> (необязательный)Тип: Строка. Может содержать слово «Возр» или «Убыв», тогда стандартный порядок будет использоваться с указанным направлением.
Может содержать имя поля (реквизита или измерения для которых указано индексирование) и через пробел слово «Возр» или «Убыв», тогда упорядочивание будет производится по указанному полю в указанном порядке.
В качестве значения параметра может быть задана строка «<Нет>» («<No>»). Это будет означать, что система выберет наиболее оптимальный порядок обхода такой выборки, который в общем случае не будет соответствовать порядку обхода по умолчанию.
Значение по умолчанию: «Возр»
Возвращаемое значение:
Тип: РегистрСведенийВыборка.
Описание:
Формирует выборку записей регистра сведений.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Пример:
Курсы = РегистрыСведений.КурсыВалют; ОтборВалют = Новый Структура(«Валюта»); ОтборВалют.Валюта = ВыбВалюта; ВыборкаКурсовВалют = Курсы.Выбрать(,,ОтборВалют); Пока ВыборкаКурсовВалют.Следующий() Цикл Сообщить(«Дата » + ВыборкаКурсовВалют.Период + » Валюта «+СокрЛП(ВыборкаКурсовВалют.Валюта) + «, Курс «+ ВыборкаКурсовВалют.Курс ); КонецЦикла;

Интересная багофича 1С при работе с контекстом управляемой формы

Ни разу не постил на Хабр, а тут такой интересный повод нарисовался.
Вопросы, обсуждаемые в статье:

  • Выбрать публичность или приватность — вот в чем вопрос;
  • Кто главнее — клиент или сервер?
  • Прочтите статью и вы увидите, как на эти вопрос отвечает 1С в своей платформе;
  • И еще неожиданный интересный факт о Google узнают те, кто дочитает до конца;
  • Я кратко расскажу, как я нашел точного виновника бага.

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

История

Итак, сижу я вечером (на дворе как раз 13 декабря), тружусь над одним из своих любимых продуктов xUnitFor1C над значимым релизом 4.0
Тестирую работу тестов в режиме управляемого приложения при переходе с клиента на сервер и обратно.
Есть у нас один интересный и непростой сценарий поведения при использовании серверных тестов в режиме управляемого приложения на тонком клиенте.
В модуле контекста ядра тестирования (Упр.форма) созданы 2 похожих метода ВыполнитьТестовыйМетодНаКлиенте (признак &НаКлиенте) и ВыполнитьТестовыйМетодНаСервере (признак &НаСервере).
Назначение их понятно из названия.
Обычно в тесте я использовал метод УпрФорма.ВыполнитьТестовыйМетодНаКлиенте для проверки тестов УФ, т.е. через контекст управляемой формы.
Все штатно, проблем нет.
Но теперь мне понадобилось проверить переход с клиента на сервер. Я решил, что хватит использовать ВыполнитьТестовыйМетодНаКлиенте, пора заняться более глубоким хакингом и вызвал метод ВыполнитьТестовыйМетодНаСервере.
Написал специальный тест, описал поведение согласно сценария и внутри теста вызываю ЭтаФорма.ВыполнитьТестовыйМетодНаСервере.
Тест предсказуемо падает, ведь я работаю по методике TDD. Начинаю разбираться, что нужно поправить в коде, чтобы тест заработал (ТДД работает именно так).
Проходит несколько минут, и я с огромным изумлением вижу, что вызываемой мной метод ВыполнитьТестовыйМетодНаСервере является приватным, т.е. у него нет признака Экспорт!
При этом я его успешно вызываю, и он прекрасно отрабатывает.

Поиск и подтверждение бага в платформе 1С

Не верю своим глазам, ведь я много умных книжек читал, знаю много языков программирования, и понимаю, что приватный метод просто так вызвать нельзя.
Сначала я проверил, вызываю я правильный код из правильного места и т.д. Еще через пару минут я убедился, что ошибки нет, действительно, я вызываю приватный метод и он успешно отрабатывает!
Также я проверил, что метод ВыполнитьТестовыйМетодНаКлиенте является публичным/экспортным методом.
Согласно методикам поиска багов я максимально упростил ситуацию и исключил сторонние факторы:
создал отдельную внешнюю обработку. Добавил к ней простую управляемую форму.

Добавил 2 команды ВызовПриватногоКлиентскогоМетода и ВызовПриватногоСерверногоМетода
Для этой формы добавил следующий код:
&НаСервере Процедура ПриватнаяНаСервере() Сообщить(«ПриватнаяНаСервере»); Сообщить(«После вызова ПриватнаяНаСервере»); КонецПроцедуры &НаКлиенте Процедура ВызовПриватногоСерверногоМетода(Команда) ЭтаФорма.ПриватнаяНаСервере(); // не выдает ошибку !! КонецПроцедуры &НаКлиенте Процедура ПриватнаяНаКлиенте() Сообщить(«ПриватнаяНаКлиенте»); КонецПроцедуры &НаКлиенте Процедура ВызовПриватногоКлиентскогоМетода(Команда) ЭтаФорма.ПриватнаяНаКлиенте(); // как и положено, выдает исключение Сообщить(«После вызова ПриватнаяНаКлиенте»); КонецПроцедуры
Первоначально я запускал подобный ручной тест на свежайшей версии 8.3.7.1805 (выпущена 10.12.2015, если я не ошибаюсь).
Получаю поведение:

  • приватный серверный метод успешно вызывается, сообщения отрабатывают. Это ошибка.
  • с приватным клиентским методом проще. Выдается правильное исключение, что метод не обнаружен.
    {Форма.Форма.Форма(15)}: Метод объекта не обнаружен (ПриватнаяНаКлиенте)
    ЭтаФорма.ПриватнаяНаКлиенте();

В итоге получаем явный баг в 8.3.7.
Далее я согласно тем же методикам поиска багов проверяю поведение на другой платформе 1С 8.2.19
Поведение абсолютно такое же.
Проверил поведение на встроенной обработке, те же проблемы.
Собственно, формулировка бага — сторонний код может вызвать приватный серверный метод управляемой формы через контекст управляемой формы, а приватный клиентский код таким образом вызвать нельзя.

Риторические вопросы

  • Получается, это не баг, это фича, потому что подобное «странное» поведение наблюдается очень давно, уже несколько лет?
  • А как же приватность/публичность? это же базовые принципы!
  • А как же инкапсуляция? получается, что кто угодно может вызвать скрытые серверные методы и нарушить поведение.
  • А как же равноправие? почему клиент настолько ущемлен по сравнению с сервером 🙂 ?

В итоге этот баг сделал мой вечер!
Надеюсь, и вам понравилась указанная багофича.
Ух, как теперь можно развернуться кодерам на языке 1С, теперь можно экспорт не писать, все и без него работает.
Это же сколько кода можно наваять, если не тратить время на написание Экспорт! А в масштабах страны какая экономия времени?
А если более серьезно, то хочется обратиться к 1С для исправления данной ошибки.
Евангелист 1С PeterG, что скажешь?
Также предлагаю встроить в продукт АПК (Автоматизированная проверка конфигурации) проверку на подобный баг.
PS Если кому-то нужно, могу дать обработку для ручного тестирования.
PPS А если кому интересно, что же нового будет в версии 4.0 xUnitFor1C, ждите следующей статьи и новогоднего подарка!
А причем здесь Google?PPPS при поиске картинки для статьи обнаружил, что при поиске картинок в Гугл для фразы «нарушение приватности» больше всего картинок с логотипом именно Google. К чему бы это?

Ошибки в 1С, связанные с контекстным методом

Ошибки при использовании той или другой программы встречаются самого разного рода. Из них есть целая серия — которые возникают по нашей вине. Рассмотрим, как исправить ошибку при выводе метода контекста в 1С, возникающую в результате несоблюдения правил и методов контекста.

Контекстные правила и методы

Любой программный продукт архитектурно состоит из модулей (module, англ.), частей. Модульные части программы 1С и их местоположение показаны на рисунке:

Программные модули, в свою очередь, состоят из разделов:

Контекст (context, англ.) — это одно из важнейших понятий в программировании. В 1С под ним понимается окружение модуля и его разделов, — какие именно переменные, свойства, объекты, метод (method) и события могут быть ему доступны в каждой конкретной точке. В разных точках context, как правило, уже другой.

Разработчик (доработчик) должен понимать — какие контекстные свойства имеет точка и какой method является доступным для использования в ней.

В восьмёрке выделены контекстные виды:

  • В любой точке конфигурации доступен Глобальный context. Отдельная ветка синтаксис-помощника показывает доступные для вызова функции:
  • Локальный context (более низкого уровня) доступен в точках каждой модульной части;
  • Ещё ниже уровень — локальный context процедуры и так далее.

Базовыми являются основные четыре правила для доступа процедур, переменных, и ф-ций в модулях:

  • В общих модульных частях не будут доступными для экспорта переменные, процедуры и ф-ции модульных приложений;
  • В модульных приложениях есть доступ для экспорта процедур и ф-ций общих модулей;
  • Для общих мод. частей открыт доступ к экспорту процедур и ф-ций прочих общих модулей;
  • Для модульных прикладных объектов и для модульных форм являются доступными переменные, функции и процедуры модулей приложений для экспорта и общих модулей.

Если какой-либо форме присвоен основной реквизит, то в контексте этой формы будут содержаться свойство и method, отвечающие этому основному реквизиту. К примеру, в модуле формы для элемента справочника Номенклатура доступен method и свойства объекта СправочникОбъект.Номенклатура.

Иллюстрация приведённых правил на схеме:

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

Несоблюдение правил и методов программного контекста

Все программисты встречались с уведомлением об ошибке 1С при вызове метода контекста. Ситуации бывают самыми разными, и также разными будут методы решения этой проблемы. Поэтому разберём лишь общие причины, так как все варианты, когда может появиться такая ошибка, даже перечислить нереально. Зная, куда смотреть и на что обратить внимание, вы сможете найти решение для своей конкретной ситуации самостоятельно. Рассмотрим такой пример:

Ошибки команд

При создании запроса в справочнике в его параметре «текст» был внесён фрагмент:

В конструкции «ГДЕ» было внесено «И», но само условие осталось непрописанным.

Реакция программы была такой:

{МОДСеанса(21)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();

Как узнать правильный метод?

Для того чтобы получить подсказку платформы 1С о том, как использовать какой-либо method, поставьте курсор на нужную функцию и нажмите «Ctrl + F1». При возникновении ошибок нужно проверить параметры, которые передаются в функцию, а также правильность использования функции.

Что полезно знать об ошибках

Напоследок проведём общий анализ ошибок в 1С. Любая из них может быть причиной тех, которым посвящена тема статьи:

  • Нарушение как логической, так физической целостности информационной базы;
  • Ошибки пользователей при обращении с платформой;
  • Ошибочно введённый разработчиком (доработчиком) код;
  • Человеческий фактор — например, забывчивость;
  • Чрезвычайные ситуации (отсутствие света, метель, дождь, град, ураган, наводнение).

Провести анализ ошибки:

  • Сравнить релизы платформы и конфигурации;
  • Прочитать полный текст сообщения до конца, некоторое время подумать и понять то, что написала машина. Очень часто люди не читают такие сообщения целиком. Но бывает, что именно в конце его содержатся рекомендации к её устранению;
  • Проанализировать насколько давней она является и обстоятельства её появления;
  • Можно ли её воспроизвести;
  • Невоспроизводимые ранее не встречавшиеся ошибки, как правило, не исправляются;
  • Повторяется ли ошибка с другого компьютера или другим пользователем. В этом случае рассмотреть очистку кэша, настройку прав, очистку пользовательских настроек.

Дополнительно о причинах ошибок:

  • Часть ошибок — это результат использования нелицензионного программного обеспечения (и windows тоже);
  • Повреждённая платформа — это самый распространённый пример. Всего один патч способен взломать версию платформы. После чего можно не обнаружить базу (или лицензию);
  • При первичном столкновении с ошибкой стоит поискать решение в поисковике — возможно решение её уже кем-то найдено;
  • Следите за актуальностью релиза конфигурации (особенно если из них сдаётся регламентированная отчётность);
  • Актуальность релиза платформы — для каждой конфигурации рекомендован свой релиз;
    Все события, происходящие в 1С, протоколируются в технологическом журнале!
  • Перед началом каких-то действий с базой необходимо делать архивную копию!

Теперь вы знаете что такое context, почему возникают связанные с ним ошибки, как анализировать ошибки в 1С и как их решать.

Столкнулся с такой ошибкой, при выводе информации на печатную форму, платформа выдает следующее сообщение:
Ошибка при вызове метода контекста (ПроверитьВывод)…
ПроверитьВывод() — это метод табличного документа, который проверяет, умещаются ли переданные табличные документы на страницу при печати. В примечании у этого метода разработчики платформы 1С сразу написали, что при возникновении проблем с получением информации о текущем принтере (например, в системе не установлено ни одного принтера), будет вызвано исключение.
Проверил установленные принтеры, все исправно и работает. Эмпирическим путем выяснил, что данная ошибка возникает только у конкретной печатной формы и только под одним пользователем.
Ошибка решилась следующими действиями (выполнять под пользователем, у которого возникла ошибка):
1) Создал пустой документ, что бы при формировании печатной формы не был задействован метод ПроверитьВывод(). Если же этот метод в любом случае вызывается, то придется его найти в конфигурации и закомментировать, или же поместить в конструкцию Попытка-Исключение-КонецПопытки.

1. Помещение ПроверитьВывод в попытку

2) Сформировал печатную форму.

2. Пустая печатная форма (кол-во товаров = 0)

3) Для текущей печатной формы открыл параметры страницы и установил правильные параметры.

3. Параметры страницы

Ошибка возникала из-за неправильных параметров страницы, которые платформа сохранила ранее при выводе на печать печатной формы, например: платформа сохранила в параметрах страницы принтер, который в дальнейшем удалили и установили новый. Параметры страницы печатной формы хранятся в свойстве табличного документа КлючПараметровПечати. Это свойство содержит ключ значения, в котором сохраняются параметры печати таблицы. Параметры печати, настроенные и сохраненные с данным ключом, впоследствии восстанавливаются при следующем показе таблицы.
Что бы данная ошибка не возникала из-за неправильных параметров страницы, свойство КлючПараметровПечати следует устанавливать не в начале процедуры вывода на печать, а в конце, так как при установке данного свойства параметры печати тут же восстанавливаются.
UPD 04/10/2015: Если устанавливать свойство КлючПараметровПечати в конце формирования табличного документа, то метод ПроверитьВывод будет использовать параметры печати установленные по-умолчанию, а не пользовательские. Что бы избежать данной ситуации, необходимо устанавливать свойство КлючПараметровСистемы в начале формирования табличного документа, а метод ПроверитьВывод поместить в конструкцию Попытка-Исключение-КонецПопытки.