База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как проверить и провести документы в 1С без движений в регистре?
- В этой теме 1 ответ, 2 участника, последнее обновление 9 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
23 сентября 2026 в 17:26 #38718
как сдать проверку сразу сех документов из моего запроса ВЫБРАТЬ
DISTINCT Реализация.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Доки
ИЗ
Документ.ВозвратТоваровПоставщику КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровПоставщику.Товары КАК РеализацияТовары
ПО РеализацияТовары.Ссылка = Реализация.Ссылка
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
//И Реализация.статус <> Значение(Перечисление.СтатусыПеремещенийТоваров.Принято)
И РеализацияТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
;ВЫБРАТЬ
ВТ_Доки.Ссылка КАК Ссылка
ИЗ
ВТ_Доки КАК ВТ_Доки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ПО ВТ_Доки.Ссылка = ТоварыНаСкладах.Регистратор
ГДЕ
ТоварыНаСкладах.Регистратор ЕСТЬ NULL -
23 сентября 2026 в 17:26 #38719
Ваш запрос уже выбирает все проведенные документы, по которым нет движений в регистре
ТоварыНаСкладах. Чтобы обработать каждый найденный документ, нужно выполнить результат запроса и в цикле передать ссылку в проверку.## 1. Запрос для получения документов без движений
Лучше ограничить проверку регистра условием по нужному виду регистратора. Сам запрос можно оставить таким:
1С (Код)123456789101112131415161718192021222324|ВЫБРАТЬ РАЗЛИЧНЫЕ| Реализация.Ссылка КАК Ссылка|ПОМЕСТИТЬ ВТ_Доки|ИЗ| Документ.ВозвратТоваровПоставщику КАК Реализация| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровПоставщику.Товары КАК РеализацияТовары| ПО РеализацияТовары.Ссылка = Реализация.Ссылка|ГДЕ| Реализация.Проведен| И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода| И РеализацияТовары.Номенклатура.ТипНоменклатуры =| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)|;||////////////////////////////////////////////////////////////////////////////////||ВЫБРАТЬ| ВТ_Доки.Ссылка КАК Ссылка|ИЗ| ВТ_Доки КАК ВТ_Доки| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах| ПО ВТ_Доки.Ссылка = ТоварыНаСкладах.Регистратор|ГДЕ| ТоварыНаСкладах.Регистратор ЕСТЬ NULLПараметры запроса нужно установить обязательно:
1С (Код)12Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);Запрос.УстановитьПараметр("КонецПериода", КонецПериода);## 2. Проверка всех найденных документов
Например, если нужно просто вывести список документов без движений:
1С (Код)123456789101112131415161718Результат = Запрос.Выполнить();Выборка = Результат.Выбрать();КоличествоДокументов = 0;Пока Выборка.Следующий() ЦиклКоличествоДокументов = КоличествоДокументов + 1;Сообщить("Нет движений в регистре ТоварыНаСкладах: "+ Строка(Выборка.Ссылка));КонецЦикла;Сообщить("Всего документов без движений: "+ Строка(КоличествоДокументов));## 3. Если для каждого документа нужно вызвать свою проверку
Допустим, у вас есть процедура:
1С (Код)1ПроверитьДокумент(СсылкаДокумента);Тогда вызов всех документов будет таким:
1С (Код)12345678Результат = Запрос.Выполнить();Выборка = Результат.Выбрать();Пока Выборка.Следующий() ЦиклПроверитьДокумент(Выборка.Ссылка);КонецЦикла;Например:
1С (Код)12345678910111213Процедура ПроверитьДокумент(СсылкаДокумента) ЭкспортЕсли Не ЗначениеЗаполнено(СсылкаДокумента) ТогдаВозврат;КонецЕсли;Сообщить("Проверяется документ: "+ Строка(СсылкаДокумента));// Здесь размещается ваша проверкаКонецПроцедуры## 4. Если нужно повторно провести все найденные документы
Если задача состоит в том, чтобы перепровести документы и сформировать движения, можно получить объект документа и записать его с проведением:
1С (Код)12345678910111213141516171819202122232425262728Результат = Запрос.Выполнить();Выборка = Результат.Выбрать();Пока Выборка.Следующий() ЦиклСсылкаДокумента = Выборка.Ссылка;ОбъектДокумента = СсылкаДокумента.ПолучитьОбъект();ПопыткаОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение);Сообщить("Документ проведен: "+ Строка(СсылкаДокумента));ИсключениеСообщить("Ошибка проведения документа "+ Строка(СсылкаДокумента)+ ": "+ ОписаниеОшибки());КонецПопытки;КонецЦикла;Но для массового проведения лучше использовать транзакцию и блокировку, особенно если документов много.
## 5. Вариант с транзакцией
1С (Код)12345678910111213141516171819202122232425НачатьТранзакцию();ПопыткаРезультат = Запрос.Выполнить();Выборка = Результат.Выбрать();Пока Выборка.Следующий() ЦиклОбъектДокумента =Выборка.Ссылка.ПолучитьОбъект();ОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение);КонецЦикла;ЗафиксироватьТранзакцию();ИсключениеОтменитьТранзакцию();ВызватьИсключение;КонецПопытки;Минус этого варианта в том, что при ошибке в одном документе будут отменены изменения по всем документам. Поэтому для массовой обработки обычно безопаснее проводить каждый документ отдельно.
## 6. Рекомендуемый вариант для массового проведения
Такой вариант не откатывает уже успешно проведенные документы, если следующий документ завершился ошибкой:
1С (Код)1234567891011121314151617181920212223242526272829303132333435363738394041424344Результат = Запрос.Выполнить();Выборка = Результат.Выбрать();Пока Выборка.Следующий() ЦиклСсылкаДокумента = Выборка.Ссылка;ПопыткаОбъектДокумента = СсылкаДокумента.ПолучитьОбъект();Если Не ОбъектДокумента.Проведен ТогдаОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение);Сообщить("Проведен документ: "+ Строка(СсылкаДокумента));Иначе// Для уже проведенного документа перепроведение обычно// выполняется записью с режимом проведенияОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение);Сообщить("Перепроведен документ: "+ Строка(СсылкаДокумента));КонецЕсли;ИсключениеСообщить("Не удалось провести документ "+ Строка(СсылкаДокумента)+ ". "+ ОписаниеОшибки());КонецПопытки;КонецЦикла;## 7. Если нужно только проверить наличие движений после проведения
После перепроведения исходный результат запроса уже не обновится. Нужно повторно выполнить запрос:
1С (Код)1234567891011121314151617181920Результат = Запрос.Выполнить();Выборка = Результат.Выбрать();Если Не Выборка.Следующий() ТогдаСообщить("Документов без движений не найдено.");ИначеПока Истина ЦиклСообщить("По-прежнему нет движений: "+ Строка(Выборка.Ссылка));Если Не Выборка.Следующий() ТогдаПрервать;КонецЕсли;КонецЦикла;КонецЕсли;## 8. Важная проверка
В вашем запросе документ считается проблемным, если у него нет вообще ни одной записи в регистре
ТоварыНаСкладах.Если документ должен делать движения только по товарам определенного типа, это условие корректно:
1С (Код)12|И РеализацияТовары.Номенклатура.ТипНоменклатуры =| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)Но если в документе есть и услуги, и товары, то наличие движений нужно проверять не просто по регистратору, а по конкретной номенклатуре. Иначе документ может иметь движения по одной строке, а другая товарная строка останется без движений.
Для простой проверки всех документов ваш основной алгоритм такой:
1С (Код)12345678910111213Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);Запрос.УстановитьПараметр("КонецПериода", КонецПериода);Результат = Запрос.Выполнить();Выборка = Результат.Выбрать();Пока Выборка.Следующий() ЦиклОбъектДокумента = Выборка.Ссылка.ПолучитьОбъект();ОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение);КонецЦикла;То есть запрос формирует список ссылок, а цикл
Пока Выборка.Следующий()последовательно обрабатывает все найденные документы.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.