Подробно рассмотрены два способа исправления отрицательных остатков по организациям без использования подсистемы Интеркампани и с использованием. Описан механизм формирования резервов на уровне процедур общего модуля. Доработки механизма и исправление ошибок.
Новая реализация механизма Интеркампани появилась в типовых конфигурациях УТ 11.4, КА 2.4, ЕРП 2.4 в начале 2018 года. Теория и общие принципы ее реализации можно посмотреть в этой статье.
Но теория – есть теория, на практике обычно получается не все также радужно и красиво. Вот, довелось проверить работу данного механизма на реальной задаче по исправлению отрицательных остатков по организациям. Пришлось покопаться в модулях, кое-что исправить и доработать.
Центральным элементом подсистемы Интеркампани, является механизм формирования резервов (создание записей в регистре накопления «Резервы товаров организаций»). И главное, что вводит в ступор, это не обычное использование этого регистра. Нельзя, как все мы привыкли, отменить проведение документов и начать все заново. Любые действия, как проведение, так и отмена проведения ведут к расчетам результирующих резервов, к тому же используются данные регистра до начала выполнения этих действия. Это не удобно и не очевидно. Требуется вспомогательные обработки для принудительного удаления записей регистра, отслеживание состояния регистра и прочие ухищрения.
Ниже, привожу описание двух способов исправления отрицательных остатков, с использованием подсистемы Интеркампани, и без. Доработки, которые потребовалось сделать. Общее описание процесса формирования резервов на уровне процедур общего модуля «Запасы сервер», с коротким описанием. Будет полезно, для тех, кто планирует разобраться как это все работает «внутри» или найти ошибку не потратив уйму времени на разбор что и где формируется. Сразу говорю, механизм совсем не простой, как и многие другие в современных конфигурациях, к сожалению.
Термины, используемые в статье для сокращения
РТО – регистр накопления «Резервы товаров организаций», в котором содержатся записи о сформированных резервах.
ТО — регистр накопления «Товары организаций».
Отборы аналитик – отборы измерений, которые используются в запросах для расчета резервов и формирования записей по регистру «РТО»:
- Вид запасов
- Аналитика учета номенклатуры
- Организация
- Номер ГТД
Документы передачи – документы «Передача товаров между организациями».
Документы списания – документы, формирующие списание товаров: «Реализация товаров и услуг», «Отчет о розничных продажах», «Возврат товаров поставщику», «Перемещение товаров», «Сборка товаров», «Списание недостач товаров», «Порча товаров», «Внутреннее потребление товаров», «Пересортица товаров».
Документы поступления – документы, формирующие поступление товаров: «Приобретение товаров и услуг», «Возврат товаров от покупателей», «Перемещение товаров», «Сборка товаров», «Оприходование излишков товаров», «Пересортица товаров».
Сложный учет по видам запасов — ведется учет по ГТД, сложный учет НДС или используется продажа товаров, принятых на комиссию (виды запасов могут измениться при перепроведении документов списания).
Настройки передач – настройки возможных передач товаров между организациями «Финансовый результат и контроллинг >> См. также >> Настройки передачи товаров между организациями»
Кейс по исправлению отрицательных остатков по организациям
Начальные условия
Учет ведется с применением большого количества организаций. Контроль остатков по организациям отключен. Произвольные поступления и списания товаров по организациям. Может применяться сложный учет по видам запасов. Количество документов списания в месяц – более 1000. Произвольным образом заполнены настройки передач. Сформировано некоторое количество документов передачи. Закрытие месяца не выполняется из-за ошибок, связанных с наличием отрицательных остатков по организациям.
Необходимый результат
Сформировать корректные передачи товаров между организациями. Закрыть период, и рассчитать себестоимость. Выполнить эти операции за каждый месяц, последовательно, с начала ведения учета.
Решение поставленной задачи
Первое, что необходимо сделать – это удалить все существующие настройки передач и отменить проведение всех существующих документов передачи.
По ходу выполнения, можно столкнуться с проблемой, что не все документы передачи будут распроводиться. Несмотря на то, что контроль остатков по организациям отключен, некоторые документы могут выдавать ошибки следующего вида «…обнаружен лишний резерв по измерениям…». Дело в том, что если при отмене проведения документа изменяются записи в регистре «РТО», будет выполняться контроль на наличие лишних резервов по тем же отборам аналитик. Это будет происходить даже в том случае, если контроль остатков по организациям отключен.
Для решения проблемы, необходимо предварительно удалить все записей из регистра «РТО». Это можно сделать внешней обработкой, используя следующий программный код:
Удаление записей из регистра «РТО»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РезервыТоваровОрганизаций.Регистратор КАК Ссылка |ИЗ | РегистрНакопления.РезервыТоваровОрганизаций КАК РезервыТоваровОрганизаций |ГДЕ | РезервыТоваровОрганизаций.Период >= &ПериодНачало | И РезервыТоваровОрганизаций.Период <= &ПериодОкончание | |СГРУППИРОВАТЬ ПО | РезервыТоваровОрганизаций.Регистратор" ; Запрос.УстановитьПараметр("ПериодНачало", Период.ДатаНачала); Запрос.УстановитьПараметр("ПериодОкончание", Период.ДатаОкончания); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ДокОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); НаборЗаписей = ДокОбъект.Движения.РезервыТоваровОрганизаций; НаборЗаписей.ДополнительныеСвойства.Вставить("НеПроверятьЛишнееСторно", Истина); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() > 0 Тогда Попытка НаборЗаписей.Очистить(); НаборЗаписей.Записать(Истина); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЕсли; КонецЦикла; |
При удалении движений, следует обязательно установить параметр набора записей «НеПроверятьЛишнееСторно». Если параметр не будет установлен, при удалении записей будет возникать следующее сообщение «Ошибка в алгоритмах при записи … в регистр РезервыТоваровОрганизаций: образуется сторно, которое не нужно для покрытия резервов по изменениям…»:
Ошибка связана с тем, что система проверяет наличие в регистре «РТО» сторно, по которым отсутствуют сторнируемые записи по тем же отборам аналитик. Установка параметра «НеПроверятьЛишнееСторно» отменяет эту проверку. После удаления всех записей из регистра «РТО», можно отменить проведение всех существующих документов передачи.
Далее, есть несколько способов исправления отрицательных остатков, какие в каких случаях целесообразно применять, смотрите на следующей схеме:
- Не ведется сложный учет по видам запасов — можно выполнить исправление, без использования механизма Интеркампани.
- Ведется сложный учет по видам запасов, но нет перекрестных передач товаров между организациями (есть четкое разграничение между поставщики товаров и продавцами) — можно выполнить исправление, без использования механизма Интеркампани.
- Ведется сложный учет по видам запасов, и есть перекрестные передачи товаров между организациями (нет четко выделенных поставщиков и продавцов товаров, один и тот же товар может передаваться от одной организации другой и обратно, в рамках разных складов) – необходимо выполнять исправление остатков с применением механизма Интеркампани.
- Для передачи товаров между организациями используется комиссионная схема — в любом случае необходимо выполнять исправление остатков с применением механизма Интеркампани.
Собственно, в первых двух случаях можно применять как способ без использования Интеркампани, так и с использованием, а в последних двух только с использованием. Рассмотрим подробно оба способа.
Исправление отрицательных остатков без использования механизма Интеркампани
Для выполнения дальнейших действий, необходимо выключить контроль остатков товаров организаций «Финансовый результат и контроллинг >> Учет товаров >> Контролировать остатки товаров организаций». Отключение контроля на время сеанса не подойдет, так как расчет остатков будет выполняться в фоновом задании, и отключенный контроль в текущем сеансе не будет действовать.
Отменять проведенные документов для данного способа нет необходимости. Однако, желательно перепровести все документы списания за корректируемый период с принудительным перезаполнением видов запасов. Если ведется сложный учет по видам запасов – перепроведение требуется обязательно. Для принудительного перезаполнения видов запасов, необходимо устанавливать дополнительное свойство документов «ПерезаполнитьВидыЗапасов». Код внешней обработки приведен ниже:
1 2 3 4 |
Документ = Выборка.Ссылка.ПолучитьОбъект(); Документ.ДополнительныеСвойства.Вставить("ПерезаполнитьВидыЗапасов", Истина); Документ.ДополнительныеСвойства.Вставить("ОкончаниеПериодаПомощникаИсправленияОстатков", Период.ДатаОкончания); Документ.Записать(РежимЗаписиДокумента.Проведение); |
Перепроведение необходимо выполнять в два этапа. Сначала документы, которые формируют списание и поступление. Затем документы, которые формируют только списание.
Параметр «ОкончаниеПериодаПомощникаИсправленияОстатков» ограничивает период в котором будут подбираться доступные виды запасов. Без его установки доступность товаров будет определяться на конец текущего месяца или на дату последней записи в регистре «ТО».
После перепроведения документов, для создания документов передачи нужно использовать обработку «Финансовый результат и контроллинг >> Сервис >> Помощник формирования передач и выкупов товаров».
Примечание. Если учет ведется в разрезе ГТД, требуется внесение исправлений в программный код обработки. По умолчанию, она подбирает остатки с отбором по ГТД, а нам необходимо подбирать остатки по всем ГТД, по которым есть остатки.
(Ниже можно посмотреть необходимые доработки…)
На первой закладке помощника, в табличной части система автоматически выводит организации, по которым существуют отрицательные остатки за выбранный период, и требуется сформировать документы передачи:
Необходимо выбрать организацию и перейти далее. На втором этапе выполнения, необходимо указать способ подбора отправителей — «По указанным приоритетам». Дальше нужно заполнить всех возможных отправителей и типы цен передачи. Приоритеты подбора доступных остатков будут согласно следованию организаций в списке:
В процессе создания документов передачи может потребоваться заполнение цен, если есть товары, на которые отсутствуют цены по указанным видам цен передачи.
Если используется сложный учет по видам запасов, после создания документов передачи для каждой организации, необходимо повторно перепроводить все документы списания с принудительным перезаполнением видов запасов. Перепроведение, так же как и до создания документов передачи, должно выполняться в два этапа.
Если все действия выполнены корректно, на первой закладке помощника список организаций-получателей должен быть пустым. Дополнительно, можно проверить данные по отчету «Остатки товаров организаций» на наличие отрицательных остатков. Если отрицательных остатков нет, можно выполнить закрытие месяца и переходить к следующему периоду.
Основной минус данного подхода — это использование видов запасов или ГТД в документах списания, которые поступили позже в течение корректируемого месяца.
Исправление отрицательных остатков с использованием механизма Интеркампани
Первое, что нужно сделать, это определиться с настройками передач. Нужно решить какая будет использоваться схема передачи: продажа или комиссия, какой тип цен будет использоваться для передачи, будут ли использоваться договоры.
Примечание. На этапе исправления остатков имеет смысл указать все возможные передачи между организациями. Для дальнейшего учета я бы посоветовал избегать перекрестных передач, если в этом нет прямой необходимости и четко выделить поставщиков и продавцов товаров. Передачу товаров от покупателя поставщику можно будет сделать при необходимости, но придется это делать вручную. Это будет дисциплинировать сотрудников.
Если требуется настроить определенный порядок организаций для подбора доступных видов запасов, смотрите ниже, как это можно сделать.
Теперь насчет необходимости отменять проведение документов.
Если не используется сложный учет по видам запасов и есть уверенность, что при перепроведении виды запасов не поменяются в документах отгрузки, можно не отменять проведение документов, а использовать выше описанную обработку для перепроведения с принудительным перезаполнением видов запасов. В данном случае, параметр «ПерезаполнитьВидыЗапасов» будет приводить к расчету резервов по документу.
Примечание. Без отмены проведения документов, для корректного формирования документов передачи, необходимо внести изменения в процедурах общего модуля «ЗапасыСервер», которые позволят формировать записи в регистр «РТО» только с учетом остатков на конец корректируемого периода. Также, это может понадобиться в любом другом случае, когда контроль остатков необходимо ограничить (по умолчанию, контроль выполняется на конец всех последующих месяцев после корректируемого периода). Подробнее о необходимых изменениях ниже.
Если перепроведение будет приводить к изменению видов запасов или ГТД, могут возникать ошибки в документах, формирующих списание и поступление. Ошибка будет возникать в том случае, если при изменении вида запасов или ГТД, по исходным значениям существует отрицательный остаток по сумме регистров «РТО» и «ТО», сформированный более поздними документами текущего месяца. Так что, для корректного формирования резервов требуется предварительная отмена проведения документов.
Перед выполнением операции необходимо отключить контроль остатков по организациям на время сеанса. Также может потребоваться временное отключение контроля остатков по регистру накопления «Обеспечение заказов». В противном случае, если присутствуют документы перемещения или сборки товаров под обособленные заказы покупателей, система не позволит отменить их проведение. Для решения проблемы, необходимо закомментировать строку «Массив.Добавить(Движения.ОбеспечениеЗаказов);» в процедуре «СформироватьСписокРегистровДляКонтроля» модулей документов: «Перемещение товаров», «Сборка товаров».
После отмены проведения документов необходимо с помощью выше описанной внешней обработки удалить все сформированные резервы и сторно резервов. Напомню, движения по регистру «РТО» формируются как при проведении, так и при отмене проведения документов.
Далее, нужно вернуть контроль остатков по организациям, который мы отключали на время сеанса.
Примечание. Вообще, необходимо иметь в виду, что для корректной работы Интеркампани НЕЛЬЗЯ отключать контроль остатков по организациям. Записи в регистре «РТО» будут создаваться в любом случае, если заполнены настройки передач. Однако, если остатков будет недостаточно, документ проведется с созданием не корректных резервов. Исправить ситуацию можно будет только принудительным удалением резервов из внешней обработки, так как любые другие действия с документом будут строиться исходя из уже существующих не корректных записей в регистре «РТО».
Далее, нужно временно отключить контроль остатков по складам, так как могут возникнуть проблемы с доступностью товаров по складам при последовательном проведении (в том случае, если в системе присутствуют заказы покупателей с установленным действием для товаров «Отгрузить»).
Выполнив все выше перечисленные действия, можно последовательно проводить документы. В случае ошибки, нужно останавливаться и разбираться. При необходимости формировать «в ручную» дополнительную передачу, или добавить новую настройку в настройки передач. Возможно, придется оприходовать какой-либо товар.
Для уменьшения количества передач товаров, можно не отменять проведение документов, которые формируют только поступление товаров. Также, в первую очередь выполнить проведение документов, которые формируют списание и поступление, а потом всех остальных. В этом случае документы списания смогут использовать виды запасов и ГТД, которые поступили позже, в течение месяца. Если это не допустимо, необходимо проводить все документы последовательно.
После корректного проведения всех документов, остается создать передачи товаров по данным регистра «РТО». Создавать документы передачи можно отдельно по каждому распоряжению из формы «Передачи к оформлению»:
Также можно использовать обработку «Помощник формирования передач и выкупов товаров». На второй закладке помощника, в данном случае, необходимо указать способ подбора отправителей — «По настройкам передачи»:
Примечание. Если документы формирующие списание и поступление проводятся отдельно, может возникнуть ситуация, когда не будут созданы документы передачи по всем существующим резервам. Это нормально, так как помощник оперирует в первую очередь наличием отрицательных остатков, а не записями в регистре «РТО». Необходимо создать недостающие передачи дополнительно.
После создания всех документов передачи можно принудительно выполнить регламентированные задание «Свертка резервов товаров организаций» и проверить содержимое регистра «РТО». Если все выше описанные операции были выполнены корректно, регистр должен быть пустым. Дальше можно выполнить закрытие месяца и переходить к следующему периоду.
После выполнения всех действий следует не забыть включить контроль остатков по складам и раскомментировать строки в модулях документов: «Перемещение товаров», «Сборка товаров».
Описание механизма формирования резервов
Следующий раздел для тех, кто хочет разобраться глубже в центральном элементе подсистемы Интеркампани. В том, каким образом происходит формирование резервов, или понять, почему система сформировала те или иные записи в регистре «РТО» при проведении, либо отмене проведения документа.
Формирование резервов происходит в два этапа:
- Первый этап – при заполнении или перезаполнении видов запасов в документах списания (выполняется перед записью документов).
- Второй этап – во время проведенения или отмене проведения документов, после записи новых движений в базу.
Соответственно, первый этап выполняется только, если требуется заполнение или перезаполнение видов запасов. При проведении документов, которые формируют только списание товаров, выполняется только первый этап. Ниже таблица для более наглядного представления:
Виды документов | Операция | Первый этап | Второй этап |
Документы поступления | Проведение | V | |
Отмена проведения | V | ||
Документы списания
|
Проведение, перепроведение с перезаполнением видов запасов | V | |
Отмена проведения | V | ||
Документы списания и поступления | Проведение, перепроведение с перезаполнением видов запасов | V | V |
Отмена проведения | V |
Формирование резервов на первом этапе
1 |
ЗаполнитьВидыЗапасов |
(Процедура в модуле документов) – определяется необходимость заполнения / перезаполнения или очистки видов запасов. Заполнение выполняется в следующих случаях:
- Проведения не проведенного документа
- Изменений в табличной части документа
- Изменение реквизитов документа: «Организация», «Дата», «НалогообложениеНДС»
- В случае установки параметра дополнительны свойств «ПерезаполнитьВидыЗапасов»
Дальнейшие операции происходят в общем модуле «ЗапасыСервер».
1 |
ЗаполнитьВидыЗапасовПоТоварамОрганизаций |
Точка входа из модулей документов.
1 |
СформироватьВТДоступныеВидыЗапасов |
Формируются доступные виды запасов по организации документа и по организациям, которые указаны в настройках передач в качестве поставщиков товаров, с учетом заданных отборов по видам запасов. Формируется ВТ «ДоступныеВидыЗапасов»
1 |
СохранитьИсходныеДвиженияТоваровИРезервов |
Выбираются исходные движения документа по регистрам «РТО» и «ТО», и помещаются в ВТ: «ДвиженияТоварыОрганизацийПередЗаписью», «ДвиженияРезервыТоварыОрганизацийПередЗаписью».
1 |
СформироватьВтОтборыОстатковПоТаблицеТоваров |
По данным документа и доступным видам запасов формируются возможные отборы остатков и сохраняются в ВТ «ВтОтборыОстатковОрганизаций«.
1 |
УстановитьБлокировкуРегистров |
Устанавливается исключительная блокировка на регистры «РТО», «РТ» и еще несколько регистров. Для отбора блокируемых записей используется ВТ «ВтОтборыОстатковОрганизаций«. Данные необходимо заблокировать, чтобы другие документы не могли использовать запасы с теми же отборами аналитик, что и в текущем документе.
1 |
СформироватьВТТоварыОрганизацийИзменения |
Создается пустая ВТ «ТоварыОрганизаций». Рассчитывается разница между данными ВТ «ДвиженияТоварыОрганизацийПередЗаписью» и «ТоварыОрганизаций». Результирующие данные помещаются в ВТ «ВТТоварыОрганизацийИзменения». По сути на первом этапе формирования резервов ВТ с изменениями содержим данные из ВТ «ДвиженияТоварыОрганизацийПередЗаписью» с отрицательным знаком.
1 |
СформироватьВТСторноРезервов |
Формируются записи сторно для дальнейшего формирования результирующих движений. Анализируются данные регистра «РТО» на наличие доступных резервов для сторнирования. Данные выбираются с отбором по ВТ «ВТТоварыОрганизацийИзменения». Сформированные данные помещаются в ВТ «ВТСторноРезервов».
Примечание. Здесь присутствует ошибка в типовом механизме. Записи сторно не должны формироваться для документов, которые делают списание и поступление товаров. Для таких документов записи сторно будут созданы на втором этапе расчета резервов.
(Ниже можно посмотреть необходимые доработки...)
1 |
СформироватьВТТаблицаОстатков |
В зависимости от параметра заполнения остатков «ИмяТаблицыОстатков» выбирается необходимая процедура. Для нашего случая, имя таблицы остатков — «ТоварыОрганизаций»
1 |
ТаблицаОстатковТоваровОрганизаций |
Формируется вспомогательная ВТ для расчета остатков: «ДвиженияДокумента», которая строится по временной таблице «ДвиженияТоварыОрганизацийПередЗаписью». Также, если существует ВТ «ВТСторноРезервов» ее записи добавляются к движениям документа.
1 |
ДополнитьЗапросКонтролемОстатковНаКаждыйМесяц |
Формируются запросы по остаткам на конец месяца текущего документа и на конец всех последующих месяцев до периода последней записи в регистре «ТО». Запросы по остаткам складываются из следующих данных:
- Данные по регистру «ТО» с текущим отбором аналитик (ВТ «ВТОтборыОстатковОрганизаций»).
- Данные по регистру «РТО» с текущим отбором аналитик(ВТ «ВТОтборыОстатковОрганизаций»).
- ВТ «ДвиженияДокумента» со знаком «-».
Каждый запрос помещается в отдельную ВТ с указанием периода в имени.
Формируются результирующие ВТ: «СгруппированныеОстатки» и «ТаблицаОстатков». При группировке выбирается минимальное значение остатка по всем месяцам контроля.
1 |
ЗаполнитьВидыЗапасовПоТаблицеОстатковСформироватьВТНовыеРезервы |
Создается ВТ «ВТНовыеРезервы» по данным документа и доступным остаткам согласно приоритетам. Новые резервы создаются в том случае, если нет доступных остатков запасов по организации документа.
1 |
ЗапросРаспределенияСУчетомПриоритетовТаблицыТоваровНаТаблицуОстатков |
Строиться ВТ «ВтОстатки», в которой остатки распределяются по приоритетам:
- Существующие виды запасов документа, если они есть.
- Виды запасов по организации документа за минусом тех, что выбраны в документе.
- Все доступные виды запасов других организаций.
Если необходимо реализовать собственный порядок организаций для подбора видов запасов, необходимо это делать именно здесь.
(Ниже можно посмотреть необходимые доработки...)
Данные текущего документа соединяются с ВТ «ВтОстатки». В результате получается распределение данных документа по доступным остаткам.
На основании таблицы распределения данных, формируется таблица с новыми резервами «ТаблицаНовыеРезервы».
1 |
РаспределитьРезервыТоваровОрганизацийПоПериодам |
Если контроль остатков выполняется за несколько месяцев, строится таблица с превышением остатка каждого месяца над минимальным остатком по всем месяцам. Если превышение равно нулю в первом месяце, период нового резерва не изменяется. Если в более поздних месяцах превышение становится меньше (то-есть уменьшается доступный остаток), новые резервы переносятся на более поздние периоды.
Пример: новый резерв = 3
Месяцы контроля остатков | Доступный остаток | Превышение мин. остатка | Распределенный резерв |
Январь | 2 | 1 | 2 |
Февраль | 1 | 0 | 1 |
Март | 3 | 2 | 0 |
На основании распределенных или не распределенных (если контроль выполняется только по корректируемому месяцу) резервов, формируется ВТ «ВТНовыеРезервы».
1 |
ТаблицаРезервыТоваровОрганизаций |
Формируются результирующее данные по резервам. Складывается информация ВТ: «ВТСторноРезервов», «ВТНовыеРезервы» и исходные движения документа по регистру «РТО» в случае, если документ формирует только списание товаров. Сформированная таблица помещается в дополнительные свойства документа для последующего использования на втором этапе расчета резервов или записи в регистр «РТО».
Формирование резервов на втором этапе
1 |
ЗапасыСервер.ПодготовитьЗаписьТоваровОрганизаций |
Выполняется прерывание процедуры, если для документа не должен выполнятся расчет резервов на втором этапе.
1 |
СохранитьИсходныеДвиженияТоваровИРезервов |
Выбираются исходные движения документа по регистрам «РТО» и «ТО», и помещаются в ВТ: «ДвиженияТоварыОрганизацийПередЗаписью», «ДвиженияРезервыТоварыОрганизацийПередЗаписью». Если расчет резервов уже выполнялся на первом этапе, эти ВТ уже существуют и не перезаполняются.
Формируется ВТ «ТоварыОрганизаций» по движениям текущего документа по регистру «ТО».
1 |
СформироватьВТТоварыОрганизацийИзменения |
Рассчитывается разница между данными ВТ «ДвиженияТоварыОрганизацийПередЗаписью» и «ТоварыОрганизаций». Результирующие данные помещаются в ВТ «ВТТоварыОрганизацийИзменения».
1 |
СформироватьВТДоступныеВидыЗапасов |
Формируются доступные виды запасов по организации, в том случае, если они не были сформированы на первом этапе расчета резервов.
1 |
УстановитьДопСвойстваКонтролироватьОстаткиИФормироватьСторно |
По данным ВТ «ВТТоварыОрганизацийИзменения» определяются и устанавливаются параметры дополнительных свойств документа: «НужноКонтролироватьОстаткиТоваровОрганизаций», «НужноФормироватьСторноПоРезервамТоваровОрганизаций». Если изменения в большую сторону, необходимо формировать сторно, если в меньшую – проконтролировать остатки.
1 |
ЗапасыСервер.СформироватьРезервыПоТоварамОрганизаций |
Выполняется прерывание процедуры, если для документа не должен выполнятся расчет резервов на втором этапе.
1 |
СформироватьВТСторноРезервов |
Действие выполняется в случае установленного параметра дополнительных свойств «НужноФормироватьСторноПоРезервамТоваровОрганизаций».
Выполняются действия, аналогичные расчету на первом этапе. Анализируются данные регистра «РТО» на наличие доступных резервов для сторнирования. Данные выбираются с отбором по ВТ «ВТТоварыОрганизацийИзменения».
Отличие в том, что на втором этапе ВТ «ВТТоварыОрганизацийИзменения» содержит именно изменения по регистру «ТО» относительно первоначальных данных. Напомню, на первом этапе данная ВТ содержит данные регистра «ТО» до проведения.
1 |
СформироватьРезервыПоОрганизациямДляКонтроля |
Действие выполняется в случае установленного параметра дополнительных свойств «НужноКонтролироватьОстаткиТоваровОрганизаций».
1 |
ОрганизацииДляКонтроляОстатков |
По данным ВТ «ВТТоварыОрганизацийИзменения» определяется список организаций для контроля.
Выполняется обход всех организаций для контроля. Все ниже перечисленные действия выполняются для каждой организации и формируется результирующая таблица значений «ТаблицаРезервыПоОрганизациямДляКонтроля».
В случае, если ВТ «ВТДоступныеВидыЗапасов» была сформирована ранее по нескольким организациям, она переформировывается по каждой, и заново создается ВТ «ВтОтборыОстатковОрганизаций».
1 |
СформироватьВТТаблицаОстатков >> ТаблицаОстатковТоваровОрганизаций |
Формируется вспомогательная ВТ для расчета остатков: «ДвиженияДокумента», которая строится по данным временных таблиц «ДвиженияТоварыОрганизацийПередЗаписью» и «ВТСторноРезервов». Также, если расчет резервов происходит в два этапа, добавляются резервы, рассчитанные на первом этапе, (если используется второй этап расчета резервов, движения по регистру «РТО» не записываются вместе с остальными движениями).
1 |
ДополнитьЗапросКонтролемОстатковНаКаждыйМесяц |
Формируются данные по остаткам по каждому месяцу контроля, начиная с месяца проведения документа, оканчивая месяцем последнего движения по регистру «ТО».
Формируются результирующие ВТ: «СгруппированныеОстатки» и «ТаблицаОстатков».
1 |
ЗапросРаспределенияРезервовПоТаблицеОстатков |
Формируются запросы по ВТ «ТаблицаОстатков». В первом запросе выбираются отрицательные остатки, которые необходимо покрыть резервами. В другом – доступные остатки для покрытия.
1 |
РаспределитьНовыеРезервыПоТаблицеОстатков |
По данным полученных таблиц: «ТаблицаРаспределения» и «ОстаткиКРаспределению» формируются новые резервы. Если доступных остатков не хватает для покрытия резервов добавляется запись в таблицу ошибок.
1 |
РаспределитьРезервыТоваровОрганизацийПоПериодам |
При необходимости, резервы распределяются по периодам аналогично расчету на первом этапе.
Новые резервы добавляются к таблице значений «ТаблицаРезервыПоОрганизациямДляКонтроля».
Если таблица ошибок не пустая, формируется сообщение об ошибке. Если включен контроль остатков по организациям устанавливается параметр отмены проведения документа:
1 |
Отказ = Истина; |
По данным таблицы значений «ТаблицаРезервыПоОрганизациямДляКонтроля» формируется ВТ «ВТРезервыПоОрганизациямДляКонтроля».
1 |
ТаблицаРезервыТоваровОрганизаций |
Формируются результирующее данные по резервам. Складывается информация ВТ: «ВТСторноРезервов», «ВТРезервыПоОрганизациямДляКонтроля», исходные движения документа по регистру «РТО» и результат расчета резервов на первом этапе.
Сформированная таблица записывается в регистр «РТО».
Исправления и доработка типовых механизмов
Исправление обработки «Помощник формирования передач и выкупов товаров»
Исправления необходимы для случая, если обработка используется для исправления остатков без применения механизмов Интеркампани, и ведется учет по ГТД. По умолчанию, обработка подбирает доступные остатки с отбором по ГТД, а необходимо, чтобы подбирались все доступные остатки, и потом сворачивались по пустому значению ГТД.
Для решения проблемы, необходимо установить флаг параметров дополнения запроса остатков «ЕстьОтборПоНомеруГТД» в значение «Ложь». Также установить значение для всех ГТД в полученных остатках – «ПустаяСсылка()», и дополнительно сгруппировать остатки. Текст запроса с изменениями смотрите ниже:
Текст исправленного запроса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
|//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СгруппированныеОстатки.Организация КАК Организация, | СгруппированныеОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры, | СгруппированныеОстатки.ВидЗапасов КАК ВидЗапасов, //++ИДС //Если отбора по ГТД нет, сворачиваем остатки и убераем ГТД //| СгруппированныеОстатки.НомерГТД КАК НомерГТД, | ВЫБОР КОГДА &ЕстьОтборПоНомеруГТД ТОГДА СгруппированныеОстатки.НомерГТД ИНАЧЕ ЗНАЧЕНИЕ(Справочник.НомераГТД.ПустаяСсылка) КОНЕЦ КАК НомерГТД, //--ИДС | МИНИМУМ(СгруппированныеОстатки.КоличествоОстаток) КАК КоличествоОстаток |ПОМЕСТИТЬ СгруппированныеОстатки |ИЗ | (ВЫБРАТЬ | ДАТАВРЕМЯ(1, 1, 1) КАК Период, | ОстаткиНаКонецПериода.Организация КАК Организация, | ОстаткиНаКонецПериода.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры, | ОстаткиНаКонецПериода.ВидЗапасов КАК ВидЗапасов, | ОстаткиНаКонецПериода.НомерГТД КАК НомерГТД, | 1 КАК СчетчикПериодов, | 1 КАК НомерПериода, | ОстаткиНаКонецПериода.КоличествоОстаток КАК КоличествоОстаток | ИЗ | РегистрНакопления.ТоварыОрганизаций.Остатки( | &ТекущийПериодГраница, | &ФормироватьПоДням И (Организация, АналитикаУчетаНоменклатуры, ВидЗапасов, НомерГТД) В | (ВЫБРАТЬ | ВТОтборыОстатковОрганизаций.Организация КАК Организация, | ВТОтборыОстатковОрганизаций.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры, | ВТОтборыОстатковОрганизаций.ВидЗапасов КАК ВидЗапасов, | ВТОтборыОстатковОрганизаций.НомерГТД КАК НомерГТД | ИЗ | ВТОтборыОстатковОрганизаций КАК ВТОтборыОстатковОрганизаций)) КАК ОстаткиНаКонецПериода | | ОБЪЕДИНИТЬ ВСЕ | |//%ТекстОстаткиПоМесяцам%) КАК СгруппированныеОстатки | |СГРУППИРОВАТЬ ПО | Период, | НомерПериода, | Организация, | АналитикаУчетаНоменклатуры, | ВидЗапасов, | НомерГТД | |ИМЕЮЩИЕ | (МИНИМУМ(СгруппированныеОстатки.КоличествоОстаток) > 0 | И СУММА(СгруппированныеОстатки.СчетчикПериодов) >= &ВсегоПериодов - СгруппированныеОстатки.НомерПериода + 1) |; |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СгруппированныеОстатки.Организация КАК ОрганизацияОстатка, | СгруппированныеОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры, | СгруппированныеОстатки.ВидЗапасов КАК ВидЗапасовОстатка, | СгруппированныеОстатки.НомерГТД КАК НомерГТД, //++ИДС //| СгруппированныеОстатки.КоличествоОстаток КАК КоличествоОстаток | СУММА(СгруппированныеОстатки.КоличествоОстаток) КАК КоличествоОстаток //--ИДС |ИЗ | СгруппированныеОстатки КАК СгруппированныеОстатки //++ИДС |СГРУППИРОВАТЬ ПО | СгруппированныеОстатки.Организация, | СгруппированныеОстатки.АналитикаУчетаНоменклатуры, | СгруппированныеОстатки.ВидЗапасов, | СгруппированныеОстатки.НомерГТД //--ИДС |; |
Все исправления необходимо выполнять для варианта формирования документов с подбором Отправителей «По указанным приоритетам» (случай, когда не используется механизм Интеркампани).
Добавленный код в процедуре «СоздатьДокументыПоПериоду»
1 2 3 4 5 6 7 8 9 10 11 12 |
ПараметрыДополненияЗапросаОстаткамиНаКаждыйМесяц = ЗапасыСервер.ПараметрыДополненияЗапросаОстаткамиНаКаждыйМесяц(); ПараметрыДополненияЗапросаОстаткамиНаКаждыйМесяц.ЕстьОтборПоНомеруГТД = Истина; //++ИДС //Если формируем по приоритетам, подразумеваем, что настроенных передач нет, в этом случае отбор по ГТД не нужен Если ПараметрыСоздания.ВариантВыбораОтправителей = "ПоУказаннымПриоритетам" Тогда ПараметрыДополненияЗапросаОстаткамиНаКаждыйМесяц.ЕстьОтборПоНомеруГТД = Ложь; Запрос.УстановитьПараметр("ЕстьОтборПоНомеруГТД", Ложь); Иначе Запрос.УстановитьПараметр("ЕстьОтборПоНомеруГТД", Истина); КонецЕсли; //--ИДС |
Найдена ошибка в работе обработки! При проведении сформированных документов передачи – теряются документы сформированные по организации с последним приоритетом. Для решения проблемы, в процедуре менеджера обработки «ЗаписатьДокументы», в случае отсутствия строк в документе, необходимо не прерывать выполнение обработки, а продолжать выполнение дальше, для следующих документов.
Исправленная функция «ЗаписатьДокументы»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
Функция ЗаписатьДокументы(СоздаваемыеДокументы, СозданныеДокументы, ОкончаниеПериодаФормирования) ВсеПроведено = Истина; ПоляШапки = ЗапасыСервер.ПоляШапкиПриОформленииПоРезервамТоваровОрганизаций(); Для Каждого СоздаваемыйДокумент из СоздаваемыеДокументы Цикл ДокументОбъект = СоздаваемыйДокумент.ДокументОбъект; Если ДокументОбъект = Неопределено Тогда Возврат ВсеПроведено; КонецЕсли; Если ДокументОбъект.Товары.Количество() = 0 Тогда //++ИДС //Возврат ВсеПроведено; Продолжить; //--ИДС КонецЕсли; ЗаполнитьЗначенияСвойств(ПоляШапки, СоздаваемыйДокумент); ДанныеЗаполнения = Новый Структура; ДанныеЗаполнения.Вставить("ПоляШапки", ПоляШапки); ДокументОбъект.Заполнить(ДанныеЗаполнения); Если ДокументОбъект.ПроверитьЗаполнение() Тогда Попытка Если ПараметрыСеанса.ПроводитьБезКонтроляОстатковТоваровОрганизаций Или Не Константы.КонтролироватьОстаткиТоваровОрганизаций.Получить() Тогда ДокументОбъект.ДополнительныеСвойства.Вставить("ОкончаниеПериодаПомощникаИсправленияОстатков", ОкончаниеПериодаФормирования); КонецЕсли; ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Исключение // Не пишем в журанал регистрации т.к. пользователь потом будет вручную проводить // документы и увидит ошибки - разбираться с ними нужно пользователю, а не администратору ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); ВсеПроведено = Ложь; КонецПопытки; Иначе ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); ВсеПроведено = Ложь; КонецЕсли; СозданныеДокументы.Добавить(ДокументОбъект.Ссылка); КонецЦикла; Возврат ВсеПроведено; КонецФункции |
Исправление даты анализа и контроля остатков для формирования резервов и передач товаров
По умолчанию, анализ и контроль остатков для расчета резервов происходит на последнюю дату формирования движений по регистру «ТО». По каким либо причинам это может быть не нужно — например выполняется исправление остатков без отмены проведения документов, или просто необходимо исключить проверку остатков в будущих периодах. В этом случае, можно реализовать анализ и контроль остатков только на конец корректируемого месяца.
Для этого необходимо внести изменения в следующие процедуры:
ЗапасыСервер >> ДополнитьЗапросКонтролемОстатковНаКаждыйМесяц – задать значение параметра «ПараметрыДополнения.ОкончаниеПериодаКонтроля» перед вызовом процедуры «ДополнитьЗапросКонтролемОстатковНаКаждыйМесяц» — установить минимальную дату остатков:
Добавление в коде процедуры «ТаблицаОстатковТоваровОрганизаций»
1 2 3 4 5 |
ПараметрыДополнения.ОкончаниеПериодаКонтроля = ОкончаниеПериодаКонтроля; //++ИДС ПараметрыДополнения.ОкончаниеПериодаКонтроля = МинимальнаяДатаОстатков; //--ИДС ВсегоПериодов = ДополнитьЗапросКонтролемОстатковНаКаждыйМесяц(Запрос, ТекстЗапроса, ПараметрыДополнения, МинимальнаяДатаОстатков, ДатыОстатков); |
ЗапасыСервер >> ДобавитьКонтрольПоТоварамОрганизаций – исключить все проверки по месяцам, кроме месяца текущего документа:
Исправления в коде процедуры
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//++ИДС //Пока ОбрабатываемыйМесяц >= МинимальныйПериод Цикл // // ТекстЗапросаОстаткаМесяца = СтрЗаменить(ШаблонЗапросаОстаткаМесяца, "&ПериодДата", "&ПериодДата" + Строка(Счетчик)); // ТекстЗапросаОстаткаМесяца = СтрЗаменить(ТекстЗапросаОстаткаМесяца, "&ПериодГраница", "&ПериодГраница" + Строка(Счетчик)); // ТекстыЗапросовОстатковПоМесяцам.Добавить(ТекстЗапросаОстаткаМесяца); // // ПакетЗапросов.УстановитьПараметр("ПериодДата" + Строка(Счетчик), ОбрабатываемыйМесяц); // ПакетЗапросов.УстановитьПараметр("ПериодГраница" + Строка(Счетчик), Новый Граница(ОбрабатываемыйМесяц, ВидГраницы.Включая)); // // Счетчик = Счетчик + 1; // ОбрабатываемыйМесяц = КонецМесяца(ДобавитьМесяц(ОбрабатываемыйМесяц, -1)); // //КонецЦикла; ТекстЗапросаОстаткаМесяца = СтрЗаменить(ШаблонЗапросаОстаткаМесяца, "&ПериодДата", "&ПериодДата" + Строка(Счетчик)); //ТекстЗапросаОстаткаМесяца = СтрЗаменить(ТекстЗапросаОстаткаМесяца, "&ПериодГраница", ""); ПакетЗапросов.УстановитьПараметр("ПериодГраница", Новый Граница(МинимальныйПериод, ВидГраницы.Включая)); //--ИДС |
МенеджерФормированиеПередачТоваровМеждуОрганизациямиИВыкупов >> СоздатьДокументыПоПериоду – задать значение для параметра запроса «КонецПериода» — установить конец периода, указанного в настройках (данный параметр влияет только на выборку данных из регистра «РТО»):
Добавление в коде процедуры «СоздатьДокументыПоПериоду»
1 2 3 4 |
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ЗапасыСервер.ДатаПоследнегоДвижения())); //++ИДС Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущийПериод)); //--ИДС |
Реализация порядка организаций для подбора доступных запасов
При подборе видов запасов для формирования резервов в типовом механизме нельзя установить порядок, в котором товары будут подбираться с разных организаций. Для решения этой проблемы необходимо:
- Добавить в справочник «Организации» новый реквизит «Порядок»
- Внести изменения в процедуру «ЗапасыСервер >> ЗапросРаспределенияСУчетомПриоритетовТаблицыТоваровНаТаблицуОстатков» — в запрос получения ВТ «ВтОстатки» добавить вывод порядка, указанного для организации при расчете поля «Приоритет». Запрос с изменениями смотрите ниже:
Текст исправленного запроса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
|ВЫБРАТЬ | ВЫБОР | КОГДА Остатки.Организация = РеквизитыДокумента.Организация | И НЕ ЕСТЬNULL(ВидыЗапасов.ТипЗапасов, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыЗапасов.ТоварНаХраненииСПравомПродажи) | ТОГДА 1 //++ИДС //| ИНАЧЕ 3 | ИНАЧЕ ВЫБОР КОГДА Остатки.Организация.Порядок > 2 ТОГДА Остатки.Организация.Порядок ИНАЧЕ 3 КОНЕЦ //--ИДС | КОНЕЦ КАК Приоритет, | Остатки.Организация КАК Организация, | Остатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры, | Остатки.СкладОтгрузки КАК СкладОтгрузки, | Остатки.ДокументРеализации КАК ДокументРеализации, | Остатки.Номенклатура КАК Номенклатура, | Остатки.Характеристика КАК Характеристика, | Остатки.Серия КАК Серия, | Остатки.Назначение КАК Назначение, | Остатки.ВидЗапасов КАК ВидЗапасов, | ВидыЗапасов.ТипЗапасов КАК ТипЗапасов, | ВидыЗапасов.Организация КАК ОрганизацияВидаЗапасов, | ВидыЗапасов.НалогообложениеНДС КАК НалогообложениеНДСВидаЗапасов, | ВидыЗапасов.ВладелецТовара КАК ВладелецТовара, | РеквизитыДокумента.Организация КАК ОрганизацияОтгрузки, | Остатки.НомерГТД КАК НомерГТД, | Остатки.ДатаПоступления КАК ДатаПоступления, | ВЫБОР | КОГДА ТаблицаВидыЗапасовСводно.Количество <= Остатки.КоличествоОстаток | ТОГДА ТаблицаВидыЗапасовСводно.Количество | ИНАЧЕ Остатки.КоличествоОстаток | КОНЕЦ КАК КоличествоОстаток, | ВЫБОР | КОГДА Остатки.КоличествоОстаток <> 0 | ТОГДА Остатки.СуммаОстаток | ИНАЧЕ 0 | КОНЕЦ КАК СуммаОстаток |ПОМЕСТИТЬ ВтОстатки |ИЗ | ТаблицаОстатков КАК Остатки | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыЗапасов КАК ВидыЗапасов | ПО Остатки.ВидЗапасов = ВидыЗапасов.Ссылка | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДанныхДокумента КАК РеквизитыДокумента | ПО (ИСТИНА) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаВидыЗапасовСводно КАК ТаблицаВидыЗапасовСводно | ПО Остатки.АналитикаУчетаНоменклатуры = ТаблицаВидыЗапасовСводно.АналитикаУчетаНоменклатуры | И Остатки.ВидЗапасов = ТаблицаВидыЗапасовСводно.ВидЗапасов | И Остатки.НомерГТД = ТаблицаВидыЗапасовСводно.НомерГТД | И (Остатки.СкладОтгрузки = ТаблицаВидыЗапасовСводно.СкладОтгрузки | ИЛИ ТаблицаВидыЗапасовСводно.СкладОтгрузки В (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка), НЕОПРЕДЕЛЕНО) | ИЛИ Остатки.СкладОтгрузки В (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка), НЕОПРЕДЕЛЕНО)) | И (Остатки.ДокументРеализации = ТаблицаВидыЗапасовСводно.ДокументРеализации | ИЛИ ТаблицаВидыЗапасовСводно.ДокументРеализации В (ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка), НЕОПРЕДЕЛЕНО) | ИЛИ Остатки.ДокументРеализации В (ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка), НЕОПРЕДЕЛЕНО)) //++ИДС | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации | ПО Остатки.Организация = Организации.Ссылка //--ИДС | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВЫБОР | КОГДА Остатки.Организация = РеквизитыДокумента.Организация | И НЕ ЕСТЬNULL(ВидыЗапасов.ТипЗапасов, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыЗапасов.ТоварНаХраненииСПравомПродажи) | ТОГДА 2 //++ИДС //| ИНАЧЕ 3 | ИНАЧЕ ВЫБОР КОГДА Остатки.Организация.Порядок > 2 ТОГДА Остатки.Организация.Порядок ИНАЧЕ 3 КОНЕЦ //--ИДС | КОНЕЦ КАК Приоритет, | Остатки.Организация КАК Организация, | Остатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры, | Остатки.СкладОтгрузки КАК СкладОтгрузки, | Остатки.ДокументРеализации КАК ДокументРеализации, | Остатки.Номенклатура КАК Номенклатура, | Остатки.Характеристика КАК Характеристика, | Остатки.Серия КАК Серия, | Остатки.Назначение КАК Назначение, | Остатки.ВидЗапасов КАК ВидЗапасов, | ВидыЗапасов.ТипЗапасов КАК ТипЗапасов, | ВидыЗапасов.Организация КАК ОрганизацияВидаЗапасов, | ВидыЗапасов.НалогообложениеНДС КАК НалогообложениеНДСВидаЗапасов, | ВидыЗапасов.ВладелецТовара КАК ВладелецТовара, | РеквизитыДокумента.Организация КАК ОрганизацияОтгрузки, | Остатки.НомерГТД КАК НомерГТД, | Остатки.ДатаПоступления КАК ДатаПоступления, | ВЫБОР | КОГДА Остатки.КоличествоОстаток > ЕСТЬNULL(ТаблицаВидыЗапасовСводно.Количество, 0) | ТОГДА Остатки.КоличествоОстаток - ЕСТЬNULL(ТаблицаВидыЗапасовСводно.Количество, 0) | ИНАЧЕ 0 | КОНЕЦ КАК КоличествоОстаток, | ВЫБОР | КОГДА Остатки.КоличествоОстаток <> 0 | ТОГДА Остатки.СуммаОстаток | ИНАЧЕ 0 | КОНЕЦ КАК СуммаОстаток |ИЗ | ТаблицаОстатков КАК Остатки | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыЗапасов КАК ВидыЗапасов | ПО Остатки.ВидЗапасов = ВидыЗапасов.Ссылка | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДанныхДокумента КАК РеквизитыДокумента | ПО (ИСТИНА) | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаВидыЗапасовСводно КАК ТаблицаВидыЗапасовСводно | ПО Остатки.АналитикаУчетаНоменклатуры = ТаблицаВидыЗапасовСводно.АналитикаУчетаНоменклатуры | И Остатки.ВидЗапасов = ТаблицаВидыЗапасовСводно.ВидЗапасов | И Остатки.НомерГТД = ТаблицаВидыЗапасовСводно.НомерГТД | И (Остатки.СкладОтгрузки = ТаблицаВидыЗапасовСводно.СкладОтгрузки | ИЛИ ТаблицаВидыЗапасовСводно.СкладОтгрузки В (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка), НЕОПРЕДЕЛЕНО) | ИЛИ Остатки.СкладОтгрузки В (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка), НЕОПРЕДЕЛЕНО)) | И (Остатки.ДокументРеализации = ТаблицаВидыЗапасовСводно.ДокументРеализации | ИЛИ ТаблицаВидыЗапасовСводно.ДокументРеализации В (ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка), НЕОПРЕДЕЛЕНО) | ИЛИ Остатки.ДокументРеализации В (ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка), НЕОПРЕДЕЛЕНО)) //++ИДС | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации | ПО Остатки.Организация = Организации.Ссылка //--ИДС | |
Исправление ошибки создания лишнего сторно
В типовом механизме, при расчете резервов на первом этапе, в случае, если документ формирует списание и поступление товаров, ошибочно создаются записи сторно. Записи будут задублированы на втором этапе расчета. Соответственно, необходимо исключить документы, которые делают поступление и списание из процедуры формирования сторно на первом этапе расчета резервов. Для этого в процедуре «ЗапасыСервер >> ЗаполнитьВидыЗапасовПоТоварамОрганизаций» необходимо поставить дополнительное условие на выполнение процедуры формирования сторно «СформироватьВТСторноРезервов»:
Исправление в коде процедуры
1 2 3 4 5 6 7 8 9 10 11 |
// Если не повторный запуск заполнения видов запасов Если Не ДокументОбъект.ДополнительныеСвойства.Свойство("ТаблицаРезервыТоваровОрганизаций") И (// и не запуск из помощника исправления Не ДокументОбъект.ДополнительныеСвойства.Свойство("ПерезаполнитьВидыЗапасов") Или Не ДокументОбъект.ДополнительныеСвойства.ПерезаполнитьВидыЗапасов) //++ИДС И Не ПараметрыЗаполненияВидовЗапасов.ДокументДелаетИПриходИРасход //--ИДС Тогда СформироватьВТСторноРезервов(ДокументОбъект, МенеджерВременныхТаблиц, ПараметрыЗаполненияВидовЗапасов); КонецЕсли; |
Автор статьи: Дмитрий Иванов