При работе с конфигурацией 1С:Зарплата и управление персоналом (ЗУП) версии 3.1 пользователи иногда сталкиваются с трудностями при проведении документа «Дивиденды». Основная проблема проявляется в виде ошибки «Ошибка при вызове метода контекста (ВыполнитьПакет)», которая может быть дополнена уточнением «Тип не может быть выбран в запросе». Эта ситуация указывает на некорректное взаимодействие программы с базой данных на уровне запросов. Давайте подробно разберем, почему возникает данная ошибка и какие шаги необходимо предпринять для ее устранения.
Сообщение об ошибке «Ошибка при вызове метода контекста (ВыполнитьПакет)» в 1С является общим указанием на то, что программа столкнулась с проблемой при выполнении пакета запросов к базе данных. Часто это связано с некорректными параметрами, передаваемыми в запрос, или с отсутствием необходимых данных. В нашем случае, более специфичное сообщение «Тип не может быть выбран в запросе» проливает свет на истинную причину проблемы.
Когда мы видим сообщение «Тип не может быть выбран в запросе», это почти всегда означает, что в запрос передается временная таблица (ТаблицаЗначений), одна или несколько колонок которой не имеют явно определенного типа данных. Система 1С, при попытке использовать такую нетипизированную колонку в запросе (особенно для создания временной таблицы), не может однозначно определить, как интерпретировать данные, что приводит к ошибке. Как мы можем видеть из детализации ошибки, проблема возникает при обращении к полю Распределение.СтатьяРасходов:
{Документ.ДивидендыФизическимЛицам.МодульОбъекта(296)}: Результат = Запрос.ВыполнитьПакет;
{Документ.ДивидендыФизическимЛицам.МодульОбъекта(20)}: ДанныеДляПроведения = ДанныеДляПроведения;
по причине: {(3, 2)}: Тип не может быть выбран в запросе
>Распределение.СтатьяРасходов КАК СтатьяРасходов,
по причине: {(3, 2)}: Тип не может быть выбран в запросе
>Распределение.СтатьяРасходов КАК СтатьяРасходов,
Ошибка при вызове метода контекста (ВыполнитьПакет)
В этом коде Распределение, скорее всего, является временной таблицей, которая формируется путем копирования данных из другой таблицы (например, ДанныеДляПроведения.Дивиденды). Если при копировании или инициализации колонка СтатьяРасходов теряет свой тип данных или не получает его изначально, запрос не сможет ее обработать. Давайте рассмотрим шаги, которые помогут нам диагностировать и устранить эту проблему.
Одной из самых распространенных причин необъяснимых ошибок в 1С является поврежденный или устаревший кэш. Система кэширует множество данных для ускорения работы, но иногда это кэширование приводит к несоответствиям. Мы должны рассмотреть очистку кэша как на стороне клиента, так и на стороне сервера.
Для начала, попробуем очистить кэш, который хранится на компьютере пользователя. Этот метод часто помогает решить множество проблем с отображением и выполнением форм. Мы можем выполнить это следующим образом:
Если клиентский кэш не помог, следующим шагом будет очистка серверного кэша. Это особенно актуально, если мы работаем с серверной базой (как в нашем случае). Серверный кэш хранит временные данные на сервере 1С, и его повреждение может вызывать ошибки, которые не устраняются клиентской очисткой. Будьте предельно внимательны при выполнении этих шагов, так как некорректные действия могут нарушить работу сервера 1С.
C:\Program Files\1cv8\srvinfo или C:\Program Files (x86)\1cv8\srvinfo.srvinfo найдем подкаталог reg_* (где * - уникальный идентификатор, например, reg_000000).reg_* найдем папку snccntx. Это и есть папка с файлами кэша серверного кластера.snccntx. Не удаляйте саму папку snccntx, только ее содержимое!Важно отметить, что путь к папке кэша может отличаться в зависимости от настроек установки сервера 1С. Если вы не уверены, как найти эти папки, лучше обратиться к системному администратору.
Документ «Дивиденды» в ЗУП 3.1, как и многие другие расчетные документы, может использовать данные из справочника «Статьи расходов» для определенных целей, хотя напрямую для расчета НДФЛ с дивидендов это поле не всегда критично. Тем не менее, если в базе данных отсутствуют необходимые элементы или справочник был поврежден, это может привести к непредсказуемым ошибкам при проведении документов. Проверим, корректно ли заполнен этот справочник.
После создания или проверки наличия такой статьи, перезапустим 1С (как указано в одном из сообщений, так как могут быть модули повторного использования, которые обновляются при перезапуске) и попробуем провести документ «Дивиденды» снова.
Иногда ошибки могут быть вызваны известными недоработками или багами в конкретных версиях платформы 1С:Предприятие или конфигурации ЗУП. В нашем случае, мы используем платформу 8.3.25.1374 и конфигурацию ЗУП 3.1.31.13. Важно убедиться, что мы используем актуальные и стабильные версии.
Даже если проблема не является известной ошибкой, обновление до более актуальных версий часто решает подобные проблемы совместимости или внутренней логики. Следует отметить, что для ЗУП 3.1 были ошибки при расчете НДФЛ с дивидендов, которые исправлялись в более поздних релизах.
Расширения — это мощный инструмент для доработки функциональности типовых конфигураций без изменения самой конфигурации. Однако, некорректно разработанные или устаревшие расширения могут вызывать конфликты с типовой логикой, приводя к ошибкам. Мы выяснили, что в нашей базе есть расширения.
Если после отключения расширений проблема исчезнет, это будет явным признаком того, что одно из расширений вызывает конфликт. В этом случае мы можем включать расширения по одному и проверять проведение документа, чтобы выявить проблемное расширение. Если отключение всех расширений не помогает, значит, причина проблемы, скорее всего, лежит в самой конфигурации или платформе, а не в расширениях.
Если все предыдущие шаги не привели к решению, нам придется углубиться в программный код и провести детальную отладку запроса, который вызывает ошибку. Сообщение об ошибке указывает на модуль объекта документа «ДивидендыФизическимЛицам» и конкретную строку Результат = Запрос.ВыполнитьПакет;, а также на формирование временной таблицы Распределение.
Результат = Запрос.ВыполнитьПакет; (строка 296, согласно сообщению об ошибке) и на строке, где формируется таблица РаспределениеПоСтатьям = ДанныеДляПроведения.Дивиденды.Скопировать(...);.Когда отладчик остановится на строке Результат = Запрос.ВыполнитьПакет;, мы сможем:
Запрос или в окне выражений, набрав Запрос.Текст.РаспределениеПоСтатьям, который передается в запрос как временная таблица.РаспределениеПоСтатьям. Используем окно выражений или отладчик, чтобы просмотреть метаданные этой таблицы значений: РаспределениеПоСтатьям.Колонки.Получить("СтатьяРасходов").ТипЗначения. Мы должны убедиться, что тип колонки СтатьяРасходов определен корректно (например, СправочникСсылка.СтатьиРасходов).Именно на этом этапе мы, скорее всего, обнаружим, что колонка СтатьяРасходов в таблице значений РаспределениеПоСтатьям не имеет явно заданного типа данных, что и вызывает ошибку «Тип не может быть выбран в запросе». Это происходит потому, что метод Скопировать() не всегда сохраняет типы колонок при копировании, особенно если исходная таблица или ее колонки также были нетипизированы.
Хотя в нашем случае пользователь работает под администраторскими правами как в 1С, так и на сервере, иногда специфические проблемы с правами могут проявляться в неожиданных местах, особенно при выполнении сложных запросов или обращении к объектам, для которых по какой-то причине права могут быть ограничены. Мы можем убедиться, что для пользователя или роли, от имени которой запускается проведение документа, есть полные права на чтение и запись справочника «Статьи расходов» и на работу с документом «ДивидендыФизическимЛицам».
Если после всех диагностических шагов мы подтвердили, что проблема заключается в нетипизированной колонке СтатьяРасходов в таблице РаспределениеПоСтатьям, и у нас нет возможности быстро обновить конфигурацию или найти патч, мы можем применить временное программное решение. Это решение будет заключаться в создании расширения, которое перехватывает логику формирования таблицы РаспределениеПоСтатьям и явно задает типы для ее колонок.
РаспределениеПоСтатьям. Скорее всего, это будет процедура ЗаполнитьДанныеДляПроведения() или подобная.РаспределениеПоСтатьям создавалась с явно определенными типами колонок, а затем данные из исходной таблицы ДанныеДляПроведения.Дивиденды копировались в эту новую, типизированную таблицу. Это можно сделать следующим образом:
// Предположим, что исходный код выглядит примерно так:
// РаспределениеПоСтатьям = ДанныеДляПроведения.Дивиденды.Скопировать( , "Акционер,СтатьяРасходов,ВидДоходаИсполнительногоПроизводства");
// Мы можем заменить его на следующий код в расширении (например, используя обработчик "ПередВыполнением" или "ПослеВыполнения"):
// Создаем новую таблицу значений с явно заданными типами колонок
НовоеРаспределениеПоСтатьям = Новый ТаблицаЗначений;
НовоеРаспределениеПоСтатьям.Колонки.Добавить("Акционер", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица")); // Указываем конкретный тип
НовоеРаспределениеПоСтатьям.Колонки.Добавить("СтатьяРасходов", Новый ОписаниеТипов("СправочникСсылка.СтатьиРасходов")); // Указываем конкретный тип
НовоеРаспределениеПоСтатьям.Колонки.Добавить("ВидДоходаИсполнительногоПроизводства", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыДоходовИсполнительногоПроизводства")); // Указываем конкретный тип
// Теперь переносим данные из исходной таблицы в новую
Для Каждого СтрокаИсходная Из ДанныеДляПроведения.Дивиденды Цикл
НоваяСтрока = НовоеРаспределениеПоСтатьям.Добавить();
НоваяСтрока.Акционер = СтрокаИсходная.Акционер;
НоваяСтрока.СтатьяРасходов = СтрокаИсходная.СтатьяРасходов;
НоваяСтрока.ВидДоходаИсполнительногоПроизводства = СтрокаИсходная.ВидДоходаИсполнительногоПроизводства;
КонецЦикла;
// И подставляем эту новую, типизированную таблицу в запрос
Запрос.УстановитьПараметр("РаспределениеПоСтатьям", НовоеРаспределениеПоСтатьям);
Этот подход гарантирует, что колонка СтатьяРасходов, а также другие колонки, будут иметь определенные типы данных, что позволит запросу корректно их обработать. После внесения изменений в расширение, сохраним его, перезапустим 1С и проверим проведение документа.
Проблема «Тип не может быть выбран в запросе» при проведении документа «Дивиденды» в 1С ЗУП 3.1 может быть вызвана рядом факторов, но чаще всего связана с нетипизированными данными, передаваемыми в запросы. Последовательное выполнение предложенных шагов — от очистки кэша и проверки базовых настроек до детальной отладки и, при необходимости, программных исправлений — поможет нам выявить и устранить корень проблемы.