Контроль отрицательных остатков в "Комплексной автоматизации 1.1" при неоперативном проведении по регистру накопления "Свободные остатки".

29.05.15

Разработка - Механизмы типовых конфигураций

Данная методика позволила просто решить задачу контроля остатков при неоперативном проведении.  
  1. Создаем новый общий модуль (для удобства последующего обновления конфигурации).
  2. Создаем подписку на событие. Источники (документы по которым контролируем остатки). Событие - Обработка проведения. Обработчик - процедура в созданном общем модуле.
Процедура Ферма_КонтрольОстатковНеоперативноеПроведение(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    Если Не Отказ И РежимЗаписи = РежимПроведенияДокумента.Неоперативный Тогда
        
        МетаданныеДокумента = Источник.Ссылка.Метаданные();
        
        // Заголовок для сообщений об ошибках проведения.
        Заголовок = ОбщегоНазначения.ПредставлениеДокументаПриПроведении(Источник.Ссылка);
        СтруктураШапкиДокумента = ОбщегоНазначения.СформироватьСтруктуруШапкиДокументаИПроверитьОтражениеВУчете(Источник, Отказ, Заголовок);
        Если МетаданныеДокумента.Реквизиты.Найти("СкладОтправитель") <> Неопределено Тогда
            СтруктураШапкиДокумента.Вставить("Склад", Источник.СкладОтправитель);
        Иначе
            СтруктураШапкиДокумента.Вставить("Склад", Источник.Склад);
        КонецЕсли;
        
        ИспользоватьРегистрСвободныеОстатки = глЗначениеПеременной("ИспользоватьРегистрСвободныеОстатки"); 
        Если ИспользоватьРегистрСвободныеОстатки И НЕ Отказ Тогда
            Если глЗначениеПеременной("ИспользоватьБлокировкуДанных")  Тогда
                Источник.Движения.СвободныеОстатки.БлокироватьДляИзменения = Истина;
            КонецЕсли;
            Источник.Движения.Записать();
            Если МетаданныеДокумента.ТабличныеЧасти.Найти("Товары") <> Неопределено И Источник.Товары.Количество() <> 0 Тогда
                Если Источник.Товары.Количество() <> 0 Тогда          
                    КонтрольОстатков(
                    "Товары", СтруктураШапкиДокумента, Отказ, Заголовок, РежимПроведенияДокумента.Оперативный);
                КонецЕсли;
            КонецЕсли;
            Если МетаданныеДокумента.ТабличныеЧасти.Найти("ВозвратнаяТара") <> Неопределено И Источник.ВозвратнаяТара.Количество() <> 0 Тогда
                Если Источник.ВозвратнаяТара.Количество() <> 0 Тогда          
                    КонтрольОстатков(
                    "ВозвратнаяТара", СтруктураШапкиДокумента, Отказ, Заголовок, РежимПроведенияДокумента.Оперативный);
                КонецЕсли;
            КонецЕсли;
            Если МетаданныеДокумента.ТабличныеЧасти.Найти("Материалы") <> Неопределено  И Источник.Материалы.Количество() <> 0 Тогда
                Если Источник.Материалы.Количество() <> 0 Тогда          
                    КонтрольОстатков(
                    "Материалы", СтруктураШапкиДокумента, Отказ, Заголовок, РежимПроведенияДокумента.Оперативный);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    
    
КонецПроцедуры
 

3. Переносим процедуры модуля менеджера регистра накопления "Свободные остатки" в созданный общий модуль на первом этапе. И немного изменяем процедуру "КонтрольОстатков"

Процедура КонтрольОстатков(ИмяТабличнойЧасти, СтруктураШапкиДокумента, ОтказПроведения, ЗаголовокСообщения, РежимПроведения) Экспорт
	Если РежимПроведения <> РежимПроведенияДокумента.Оперативный Тогда
		Возврат;
	КонецЕсли;
	
	Если УправлениеДопПравамиПользователей.РазрешеноПревышениеОстаткаТоваровНаСкладе() Тогда
		Возврат;
	КонецЕсли;
	
	Отказ     = ОтказПроведения;
    Заголовок = ЗаголовокСообщения;

	СтруктураПараметров = ПолучитьСтруктуруПараметров(СтруктураШапкиДокумента, ИмяТабличнойЧасти, Заголовок);
	Если СтруктураПараметров = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Подготовим временную таблицу табличной части документа
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	Если НЕ СформироватьВременнуюТаблицуПоТаблицеДокумента(МенеджерВременныхТаблиц, СтруктураПараметров) Тогда
		// Нет номенклатуры, по которой необходимо контролировать остатки
		Возврат;
	КонецЕсли;
	// Получим данные для передачи в процедуру ПроверитьОстатки()
	
	ТекстЗапроса = "ВЫБРАТЬ
	               |	ТаблицаОстатков.Склад КАК Склад,
	               |	ТаблицаОстатков.Номенклатура КАК Номенклатура,
	               |	ТаблицаОстатков.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
	               |	ТаблицаОстатков.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	               |	ТаблицаОстатков.Номенклатура.ВестиУчетПоСериям КАК НоменклатураВестиУчетПоСериям,
	               |	ТаблицаОстатков.Номенклатура.ВестиУчетПоХарактеристикам КАК НоменклатураВестиУчетПоХарактеристикам,
	               |	ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка) КАК СерияНоменклатуры,
	               |	ТаблицаОстатков.Качество КАК Качество,
	               |	ТаблицаОстатков.КоличествоОстаток КАК Количество
	               |ИЗ
	               |	РегистрНакопления.СвободныеОстатки.Остатки(
	               |			&ДокументКонтроля,
	               |			(Склад, Номенклатура, ХарактеристикаНоменклатуры, Качество) В
	               |				(ВЫБРАТЬ
	               |					Таблица.Склад,
	               |					Таблица.Номенклатура,
	               |					Таблица.ХарактеристикаНоменклатуры,
	               |					Таблица.Качество
	               |				ИЗ
	               |					ВременнаяТаблицаДокумента КАК Таблица)) КАК ТаблицаОстатков
	               |ГДЕ
	               |	ТаблицаОстатков.КоличествоОстаток < 0";
	Если СтруктураПараметров.ЕстьСерия Тогда
		//Контроль остатков с учетом серии - отличия от предыдущего запроса помечены комментариями
		ТекстЗапроса = ТекстЗапроса + "
		|ОБЪЕДИНИТЬ ВСЕ
		|ВЫБРАТЬ
		|	ТаблицаОстатков.Склад               						КАК Склад,
		|	ТаблицаОстатков.Номенклатура                   				КАК Номенклатура,
		|	ТаблицаОстатков.Номенклатура.ЕдиницаХраненияОстатков 		КАК ЕдиницаИзмерения,
		|	ТаблицаОстатков.ХарактеристикаНоменклатуры          		КАК ХарактеристикаНоменклатуры,
		|	ТаблицаОстатков.Номенклатура.ВестиУчетПоСериям          	КАК НоменклатураВестиУчетПоСериям,
		|	ТаблицаОстатков.Номенклатура.ВестиУчетПоХарактеристикам 	КАК НоменклатураВестиУчетПоХарактеристикам,
		//серия - из документа
		|	ТаблицаОстатков.СерияНоменклатуры 							КАК СерияНоменклатуры,
		|	ТаблицаОстатков.Качество 									КАК Качество,
		|	ТаблицаОстатков.КоличествоСУчетомСерииОстаток              	КАК Количество
		|ИЗ
		|	РегистрНакопления.СвободныеОстатки.Остатки(&ДокументКонтроля,
		//			остатки отбираются с учетом серии номенклатуры
		|			(Склад, Номенклатура, ХарактеристикаНоменклатуры, Качество, СерияНоменклатуры) В
		|				(ВЫБРАТЬ
		|					Таблица.Склад,
		|					Таблица.Номенклатура,
		|					Таблица.ХарактеристикаНоменклатуры,
		|					Таблица.Качество,
		|					Таблица.СерияНоменклатуры
		|				ИЗ
		|					ВременнаяТаблицаДокумента КАК Таблица
		//				учитывается только та номенклатура, по которой ведется учет по сериям
		|				ГДЕ Таблица.Номенклатура.ВестиУчетПоСериям
		|				)
		|	) КАК ТаблицаОстатков
		|
		|ГДЕ
		|	ТаблицаОстатков.КоличествоСУчетомСерииОстаток < 0";
	КонецЕсли;

	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Запрос.УстановитьПараметр("Ссылка", СтруктураПараметров.ДокументСсылка);
	Запрос.УстановитьПараметр("ДокументКонтроля", Новый Граница(СтруктураПараметров.ДокументСсылка.МоментВремени()));

	Запрос.Текст = ТекстЗапроса;
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	ПроверитьОстатки(Выборка, Отказ, Заголовок, СтруктураПараметров);
	
	ОтказПроведения = Отказ;
    ЗаголовокСообщения = Заголовок;

КонецПроцедуры // КонтрольОстатков()
 

Теперь, если у вас настроен контроль по регистру "Свободные остатки" и у роли пользователя нет разрешения проводить документы не контролируя остатки, документ не должен проводится при превышении остатка.

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Механизмы типовых конфигураций Программист Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)

Интервальные регистры в 1С:ЗУП 3.1 заменяют тяжелые срезы последних, ускоряя отчеты по кадровым данным через интервалы ДатаНачала–ДатаОкончания. Разбираем отличия, примеры кода, плюсы и способы синхронизации.

12.03.2026    1328    AlexeyPROSTO_1C    4    

17

Механизмы типовых конфигураций Программист Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)

Как в ЗУП работает механизм расстановки времени в регистрах сведений с помощью подписки на события?Рассматривается логика сдвигов для разных типов документов (прием, увольнение, отпуск) и дается инструкция по подключению нового регистра к этому механизму.

03.03.2026    548    YA_1100893639    1    

7

Механизмы типовых конфигураций Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

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

11.08.2025    6311    user1988284    0    

21

Механизмы типовых конфигураций Программист 1С:Предприятие 8 Бесплатно (free)

Каждый, кто работал с кадровыми отчетами в ЗУП, ERP или УХ, сталкивался с механизмом представлений – странным кодом запроса, где поля отображаются пустыми ссылками, а в названии временной таблицы есть слово «Представление». В статье разберем, что такое представления и как ими пользоваться. Больше не нужно ломать голову над тем, откуда и как правильно получать данные. Механизм представлений сделает это за вас.

08.07.2025    12689    user2012581    55    

61

Механизмы типовых конфигураций Программист Стажер 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бесплатно (free)

В типовых решениях типа УТ, КА, ERP при вводе строк в поля ввода осуществляется поиск по первым символам. С помощью небольшой доработки (делается через расширение) можно организовать поиск по вхождению.

02.06.2025    2939    lkey    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kodosane 29.08.16 15:37 Сейчас в теме
Здравствуйте. А можно подробнее,
документы по которым контролируем остатки
- это конкретно что?
2. duhh 241 30.08.16 10:10 Сейчас в теме
(1) kodosane, Реализация, списание, перемещение .....
Для отправки сообщения требуется регистрация/авторизация