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

29.05.15

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

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

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

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

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

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

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

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

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

 

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Механизмы типовых конфигураций Разработчик 1С 8.5 1С:Управление нашей фирмой 3.0 Абонемент ($m)

Кто ссылается на этот справочник, на что ссылается документ и какие регистры он двигает — обработка показывает это схемой прямо в базе. Выбранный объект — в центре, слева — кто ссылается на него, справа — на что ссылается он, под схемой — через какой реквизит; щелчок по соседу делает центром его. Много соседей — группы по видам, связи через составные типы — пунктиром и отключаются флажком. Для документации схему можно взять текстом PlantUML или сохранить файлом HTML вместе с таблицей связей. В статье я разбираю код: связи по типам реквизитов, движениям и владельцам, временное хранилище формы, схему в поле HTML и щелчок по узлу.

2 стартмани

30.09.2026    818    17    Petr_32    2    

6

Механизмы типовых конфигураций Разработчик 1С:Предприятие 8 Абонемент ($m)

Использование переопределяемых процедур в 1С на управляемых формах.

1 стартмани

01.09.2026    4253    waider    3    

15

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

С 1 сентября компании с выручкой от 120 миллионов обязаны принимать цифровой рубль, за отказ — штраф до 50 тысяч за каждый случай. Я снял выгрузку с актуального релиза «Управления торговлей» и пошёл смотреть, где это включается. Оказалось, что казначейский контур в типовой сделан подробно, а кассового нет вообще — и это не забывчивость, а решение, записанное в конфигурации прямым текстом.

31.08.2026    2371    G_100802897175107255412    6    

5

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Разработчик 1С 8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данное расширение — это механизм, сделанный при помощи двух модулей из БСП (3.1.11.415), который позволяет динамически добавлять команды (кнопки и не только при желании) на формы управляемого приложения без изменения конфигурации. На примере данного механизма удобно рассмотреть некоторые возможности для расширения функционала объектов, которые подключены к механизму библиотеки стандартных подсистем.

1 стартмани

20.03.2026    5332    InFlach    0    

6

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

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

12.03.2026    7150    AlexeyPROSTO_1C    5    

21

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

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

03.03.2026    4575    YA_1100893639    1    

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