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