Почему возникает ошибка «Тип не может быть выбран в запросе» при проведении документа «Дивиденды» в 1С ЗУП 3.1 и как ее исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Налоговый учет
← На главную

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

Разбираемся с ошибкой «Тип не может быть выбран в запросе»

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

Когда мы видим сообщение «Тип не может быть выбран в запросе», это почти всегда означает, что в запрос передается временная таблица (ТаблицаЗначений), одна или несколько колонок которой не имеют явно определенного типа данных. Система 1С, при попытке использовать такую нетипизированную колонку в запросе (особенно для создания временной таблицы), не может однозначно определить, как интерпретировать данные, что приводит к ошибке. Как мы можем видеть из детализации ошибки, проблема возникает при обращении к полю Распределение.СтатьяРасходов:


{Документ.ДивидендыФизическимЛицам.МодульОбъекта(296)}: Результат = Запрос.ВыполнитьПакет;
{Документ.ДивидендыФизическимЛицам.МодульОбъекта(20)}: ДанныеДляПроведения = ДанныеДляПроведения;
по причине: {(3, 2)}: Тип не может быть выбран в запросе
>Распределение.СтатьяРасходов КАК СтатьяРасходов,
по причине: {(3, 2)}: Тип не может быть выбран в запросе
>Распределение.СтатьяРасходов КАК СтатьяРасходов,
Ошибка при вызове метода контекста (ВыполнитьПакет)

В этом коде Распределение, скорее всего, является временной таблицей, которая формируется путем копирования данных из другой таблицы (например, ДанныеДляПроведения.Дивиденды). Если при копировании или инициализации колонка СтатьяРасходов теряет свой тип данных или не получает его изначально, запрос не сможет ее обработать. Давайте рассмотрим шаги, которые помогут нам диагностировать и устранить эту проблему.

Шаг 1: Очистка кэша

Одной из самых распространенных причин необъяснимых ошибок в 1С является поврежденный или устаревший кэш. Система кэширует множество данных для ускорения работы, но иногда это кэширование приводит к несоответствиям. Мы должны рассмотреть очистку кэша как на стороне клиента, так и на стороне сервера.

  1. Очистка клиентского кэша:

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

    1. Закроем все запущенные экземпляры 1С:Предприятия.
    2. Откроем список баз 1С:Предприятия.
    3. Выделим проблемную базу в списке.
    4. Нажмем кнопку «Изменить».
    5. В открывшемся окне, на втором шаге, скопируем полный путь к базе данных.
    6. Удалим базу из списка (кнопка «Удалить»). Не беспокойтесь, сама база данных на диске не удалится.
    7. Добавим базу обратно в список, указав тот же путь, который мы скопировали.
    8. Перезапустим 1С и попробуем провести документ «Дивиденды» снова.
  2. Очистка серверного кэша:

    Если клиентский кэш не помог, следующим шагом будет очистка серверного кэша. Это особенно актуально, если мы работаем с серверной базой (как в нашем случае). Серверный кэш хранит временные данные на сервере 1С, и его повреждение может вызывать ошибки, которые не устраняются клиентской очисткой. Будьте предельно внимательны при выполнении этих шагов, так как некорректные действия могут нарушить работу сервера 1С.

    1. Зайдем на сервер, где установлен сервер 1С:Предприятия.
    2. Откроем «Службы» Windows (можно найти через «Панель управления» -> «Администрирование» -> «Службы» или через поиск «services.msc»).
    3. Найдем службу «Агент сервера 1С:Предприятия 8.3 (x86-64)» (или аналогичную, в зависимости от версии платформы и разрядности).
    4. Остановим эту службу. Убедимся, что она полностью остановлена.
    5. Перейдем в каталог установки сервера 1С. Обычно это C:\Program Files\1cv8\srvinfo или C:\Program Files (x86)\1cv8\srvinfo.
    6. Внутри каталога srvinfo найдем подкаталог reg_* (где * - уникальный идентификатор, например, reg_000000).
    7. Внутри reg_* найдем папку snccntx. Это и есть папка с файлами кэша серверного кластера.
    8. Удалим все содержимое папки snccntx. Не удаляйте саму папку snccntx, только ее содержимое!
    9. Вернемся в «Службы» Windows и запустим службу «Агент сервера 1С:Предприятия 8.3 (x86-64)».
    10. Перезапустим 1С и попробуем провести документ «Дивиденды».

    Важно отметить, что путь к папке кэша может отличаться в зависимости от настроек установки сервера 1С. Если вы не уверены, как найти эти папки, лучше обратиться к системному администратору.

Шаг 2: Проверка справочника "Статьи расходов"

Документ «Дивиденды» в ЗУП 3.1, как и многие другие расчетные документы, может использовать данные из справочника «Статьи расходов» для определенных целей, хотя напрямую для расчета НДФЛ с дивидендов это поле не всегда критично. Тем не менее, если в базе данных отсутствуют необходимые элементы или справочник был поврежден, это может привести к непредсказуемым ошибкам при проведении документов. Проверим, корректно ли заполнен этот справочник.

  1. Перейдем в раздел «Настройка» или «Главное» (в зависимости от настроек интерфейса) и найдем справочник «Статьи расходов».
  2. Убедимся, что в справочнике существует статья с типом «Дивиденды». Если ее нет, мы можем создать новую статью.
  3. Для создания новой статьи:
    1. Нажмем кнопку «Создать».
    2. В поле «Наименование» укажем, например, «Дивиденды».
    3. В поле «Тип статьи расходов» выберем значение «Дивиденды».
    4. Запишем и закроем элемент.

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

Шаг 3: Актуализация платформы и конфигурации

Иногда ошибки могут быть вызваны известными недоработками или багами в конкретных версиях платформы 1С:Предприятие или конфигурации ЗУП. В нашем случае, мы используем платформу 8.3.25.1374 и конфигурацию ЗУП 3.1.31.13. Важно убедиться, что мы используем актуальные и стабильные версии.

  1. Проверим актуальность платформы: Зайдем на сайт поддержки пользователей 1С (users.v8.1c.ru) и сравним используемую версию платформы (8.3.25.1374) с последней стабильной версией. Если есть более новая версия, рассмотрим возможность обновления. Обновления платформы часто включают исправления ошибок и улучшения стабильности.
  2. Проверим актуальность конфигурации ЗУП: Аналогично, на сайте поддержки 1С проверим, существуют ли более новые релизы конфигурации ЗУП 3.1.31.13. Разработчики постоянно выпускают патчи и обновления, которые устраняют выявленные ошибки. Убедимся, что наша конфигурация обновлена до последнего рекомендованного релиза.

Даже если проблема не является известной ошибкой, обновление до более актуальных версий часто решает подобные проблемы совместимости или внутренней логики. Следует отметить, что для ЗУП 3.1 были ошибки при расчете НДФЛ с дивидендов, которые исправлялись в более поздних релизах.

Шаг 4: Анализ влияния расширений

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

  1. Откроем 1С в режиме «Конфигуратор».
  2. Перейдем в меню «Конфигурация» -> «Расширения конфигурации».
  3. В открывшемся окне мы увидим список всех установленных расширений.
  4. Временно отключим все расширения, сняв флажок «Активно» для каждого из них.
  5. Перезапустим 1С в режиме «Предприятие» и попробуем провести документ «Дивиденды».

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

Шаг 5: Детальная отладка запроса

Если все предыдущие шаги не привели к решению, нам придется углубиться в программный код и провести детальную отладку запроса, который вызывает ошибку. Сообщение об ошибке указывает на модуль объекта документа «ДивидендыФизическимЛицам» и конкретную строку Результат = Запрос.ВыполнитьПакет;, а также на формирование временной таблицы Распределение.

  1. Установим точку останова: Откроем 1С в режиме «Конфигуратор». Найдем документ «ДивидендыФизическимЛицам», откроем его модуль объекта. Установим точку останова на строке Результат = Запрос.ВыполнитьПакет; (строка 296, согласно сообщению об ошибке) и на строке, где формируется таблица РаспределениеПоСтатьям = ДанныеДляПроведения.Дивиденды.Скопировать(...);.
  2. Запустим отладку: Запустим 1С в режиме отладки (меню «Отладка» -> «Начать отладку») и попробуем провести документ «Дивиденды».
  3. Анализ параметров запроса:

    Когда отладчик остановится на строке Результат = Запрос.ВыполнитьПакет;, мы сможем:

    1. Просмотреть текст запроса, используя контекстное меню для переменной Запрос или в окне выражений, набрав Запрос.Текст.
    2. Проверить значения всех параметров запроса, особенно параметра РаспределениеПоСтатьям, который передается в запрос как временная таблица.
    3. Особое внимание уделим структуре и типам колонок в переменной РаспределениеПоСтатьям. Используем окно выражений или отладчик, чтобы просмотреть метаданные этой таблицы значений: РаспределениеПоСтатьям.Колонки.Получить("СтатьяРасходов").ТипЗначения. Мы должны убедиться, что тип колонки СтатьяРасходов определен корректно (например, СправочникСсылка.СтатьиРасходов).
  4. Тестирование запроса в консоли: Скопируем текст запроса и значения всех его параметров в консоль запросов 1С. Это позволит нам воспроизвести проблему изолированно от кода документа и поэкспериментировать с типами данных и структурой временной таблицы, чтобы найти причину ошибки. В консоли запросов мы можем явно задать типы для колонок временной таблицы и проверить, будет ли запрос успешно выполнен.

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

Шаг 6: Проверка прав доступа

Хотя в нашем случае пользователь работает под администраторскими правами как в 1С, так и на сервере, иногда специфические проблемы с правами могут проявляться в неожиданных местах, особенно при выполнении сложных запросов или обращении к объектам, для которых по какой-то причине права могут быть ограничены. Мы можем убедиться, что для пользователя или роли, от имени которой запускается проведение документа, есть полные права на чтение и запись справочника «Статьи расходов» и на работу с документом «ДивидендыФизическимЛицам».

Шаг 7: Временное решение через расширение (инициализация таблицы значений с явными типами)

Если после всех диагностических шагов мы подтвердили, что проблема заключается в нетипизированной колонке СтатьяРасходов в таблице РаспределениеПоСтатьям, и у нас нет возможности быстро обновить конфигурацию или найти патч, мы можем применить временное программное решение. Это решение будет заключаться в создании расширения, которое перехватывает логику формирования таблицы РаспределениеПоСтатьям и явно задает типы для ее колонок.

  1. Создадим новое расширение: Откроем Конфигуратор, перейдем в «Конфигурация» -> «Расширения конфигурации» и создадим новое расширение.
  2. Добавим заимствованный объект: Добавим в расширение заимствованный объект — документ «ДивидендыФизическимЛицам».
  3. Изменим модуль объекта: Перейдем в модуль объекта заимствованного документа. Найдем процедуру или функцию, которая формирует таблицу РаспределениеПоСтатьям. Скорее всего, это будет процедура ЗаполнитьДанныеДляПроведения() или подобная.
  4. Внедрим код для явного типизирования: Мы должны будем изменить логику таким образом, чтобы таблица значений РаспределениеПоСтатьям создавалась с явно определенными типами колонок, а затем данные из исходной таблицы ДанныеДляПроведения.Дивиденды копировались в эту новую, типизированную таблицу. Это можно сделать следующим образом:

// Предположим, что исходный код выглядит примерно так:
// РаспределениеПоСтатьям = ДанныеДляПроведения.Дивиденды.Скопировать( , "Акционер,СтатьяРасходов,ВидДоходаИсполнительногоПроизводства");

// Мы можем заменить его на следующий код в расширении (например, используя обработчик "ПередВыполнением" или "ПослеВыполнения"):

// Создаем новую таблицу значений с явно заданными типами колонок
НовоеРаспределениеПоСтатьям = Новый ТаблицаЗначений;
НовоеРаспределениеПоСтатьям.Колонки.Добавить("Акционер", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица")); // Указываем конкретный тип
НовоеРаспределениеПоСтатьям.Колонки.Добавить("СтатьяРасходов", Новый ОписаниеТипов("СправочникСсылка.СтатьиРасходов")); // Указываем конкретный тип
НовоеРаспределениеПоСтатьям.Колонки.Добавить("ВидДоходаИсполнительногоПроизводства", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыДоходовИсполнительногоПроизводства")); // Указываем конкретный тип

// Теперь переносим данные из исходной таблицы в новую
Для Каждого СтрокаИсходная Из ДанныеДляПроведения.Дивиденды Цикл
    НоваяСтрока = НовоеРаспределениеПоСтатьям.Добавить();
    НоваяСтрока.Акционер = СтрокаИсходная.Акционер;
    НоваяСтрока.СтатьяРасходов = СтрокаИсходная.СтатьяРасходов;
    НоваяСтрока.ВидДоходаИсполнительногоПроизводства = СтрокаИсходная.ВидДоходаИсполнительногоПроизводства;
КонецЦикла;

// И подставляем эту новую, типизированную таблицу в запрос
Запрос.УстановитьПараметр("РаспределениеПоСтатьям", НовоеРаспределениеПоСтатьям);

Этот подход гарантирует, что колонка СтатьяРасходов, а также другие колонки, будут иметь определенные типы данных, что позволит запросу корректно их обработать. После внесения изменений в расширение, сохраним его, перезапустим 1С и проверим проведение документа.

Проблема «Тип не может быть выбран в запросе» при проведении документа «Дивиденды» в 1С ЗУП 3.1 может быть вызвана рядом факторов, но чаще всего связана с нетипизированными данными, передаваемыми в запросы. Последовательное выполнение предложенных шагов — от очистки кэша и проверки базовых настроек до детальной отладки и, при необходимости, программных исправлений — поможет нам выявить и устранить корень проблемы.

← На главную