ОперацияБух и работа с аналитикой учета. БП 3.0

19.08.24

База данных - Свертка базы

Представлена рабочая обработка для перехода на учет партий в учете запасов (не универсальная). Дополнительно расписана технология работы с документом ОперацияБух и с аналитиками учета (основная цель).

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ОперацияБух и работа с аналитиками учета
.epf 12,81Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Всем привет!

Продемонстрирую:

  • пример работы с аналитиками учета (затрат и НДС);
  • пример работы с документом ОперацияБух - будем заполнять проводки;
  • пример свертки регистра накопления "Раздельный учет НДС", который содержит в составе измерений справочные данные аналитик учета (затрат и НДС);
  • пример свертки регистра бухгалтерии Хозрасчетный по определенному счету.

На основе этих примеров вы сможете разработать свои правила для сворачивания баз данных БП Проф и Корп 3.0. На универсальность не претендую.

Примеры реализованы:

  • на платформе 1С:Предприятие 8.3.25.1374;
  • на конфигурации Бухгалтерия предприятия КОРП, релизы 3.0.155.21, 3.0.131.27.

* * *

Задача, на основе которой была разработана внешняя обработка, и в качестве примера которой будут представлены алгоритмы, следующая - до января 2024 года учет запасов велся на 10 счете без учета партий. С 1 января 2024 года нужно включить учет партий по ФИФО. Подобная задача может встретиться для направления оборонзаказа, для которого списание материалов должно происходить строго по ФИФО.

Итак, мы включаем параметр в настройках учета - см. рис.

 

 

И на начало 2024 года должны списать остатки по 10 счету без партий и оприходовать те же остатки уже с одной Партией. В БП есть специализированный документ "Партия" (см. рис. ниже) - для указания партии при вводе начальных остатков, в остальном - все документы поступления и перемещений являются документами-партий автоматически.

 

 

Решение исходной задачи делится на два этапа. На первом этапе мы сводим остатки по счету 10 - для примера рассмотрим только субсчет 10.01, на втором - сводим остатки по регистру "Раздельный учет НДС".

На первом этапе - при работе с регистром Хозрасчетный - у нас нет аналитик учета (см. рис.).

 

 

Они возникают на втором этапе - когда мы начинаем работать с регистром накопления - конкретно, с регистром Раздельный учет НДС (см. рис.).

 

 

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

Итак, приступим к решению задачи. Сначала получим остатки на конец 2023 года по счету 10.01, затем заполним проводки следующим образом: по Кредиту 10.01 спишем, по Дебету 10.01 оприходуем остатки - см. листинг 1.

Для начинающих дополнительно напишу:

  1. ресурс Сумма - балансовый (прописываем один раз), ресурсы Количество и СуммаНУ - не балансовые, поэтому прописываем по Кт и Дт отдельно. На практике часто значения по Кт и Дт совпадают, но в теории совпадать не обязательны. 
  2. Для установки субконто используется устоявшаяся конструкция БухгалтерскийУчет .УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, 1, Выборка.Субконто1). Посмотрите общий модуль БухгалтерскийУчет и процедуру УстановитьСубконто - такой алгоритм используется с 2008 года (может и ранее) и перешел из обычных форм на управляемые без изменений. Полагаю, что в ERP алгоритм аналогичный.
 
 Листинг 1. Заполняем проводки по счету 10.01 в документе ОперацияБух
&НаСервере
Процедура ЗаполнитьОстаткамиНаСервере()
	
	//1. получим список остатков по субконто 		
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ХозрасчетныйОстатки.Счет КАК Счет,
	|	ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
	|	ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
	|	ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
	|	ХозрасчетныйОстатки.Организация КАК Организация,
	|	ХозрасчетныйОстатки.КоличествоОстаток КАК Количество,
	|	ХозрасчетныйОстатки.СуммаОстаток КАК Сумма
	|ИЗ
	|	РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки";
	
	Запрос.УстановитьПараметр("Период", Объект.Период);  
	Запрос.УстановитьПараметр("Счет", Объект.Счет); 
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();

	Док = Объект.ОперацияБух.ПолучитьОбъект(); 	
	
	НЗ = Док.Движения.Хозрасчетный;
	
	//2. заполним операцию бух
	Пока Выборка.Следующий() Цикл 		
		
		//регистр Хозрасчетный
		Запись = НЗ.Добавить();
		Запись.Период 		= Объект.Период; 
		Запись.УточнениеПериода = Объект.Период; 
		Запись.Организация	= Выборка.Организация;
		
		Запись.СчетДт		= Объект.Счет; 
		Запись.КоличествоДт	= Выборка.Количество;
		Запись.СуммаНУДт	= Выборка.Сумма;
		
		БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, 1, Выборка.Субконто1);
		БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, 2, Выборка.Субконто2); 
		БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, 3, Выборка.Субконто3);
		БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, Объект.НомСубконтоПартия, Объект.ДокПартии);
		
		Если Объект.ВклНовыйСклад Тогда
			БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, Объект.НомСубконтоСклад, Объект.Склад);
		КонецЕсли;

		Запись.СчетКт    	= Объект.Счет;  
		Запись.КоличествоКт	= Выборка.Количество; 
		Запись.СуммаНУКт	= Выборка.Сумма;
		
		БухгалтерскийУчет.УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, 1, Выборка.Субконто1);
		БухгалтерскийУчет.УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, 2, Выборка.Субконто2); 
		БухгалтерскийУчет.УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, 3, Выборка.Субконто3);  
		
		Запись.Сумма		= Выборка.Сумма;  		
		
	КонецЦикла;
	
	НЗ.Записывать = Истина;
	НЗ.Записать();	
	
	... //другой код - см. листинги ниже
	
КонецПроцедуры

 

Я не использую конструкцию Док = Документы.ОперацияБух.СоздатьОбъект(). Я создаю документы ОперацияБух, Партия, СчетФактураПолученный вручную интерактивно, затем использую в обработке - см. рис. Хотя название обработки остается без изменений "СоздатьОперациюБух". Такой оборот речи.

 

 

Если вам нужно на начало года оставить один склад, то можете использовать в обработке параметр "ВключитьНовыйСклад" и указать склад. Тогда остатки по счету 10.01 спишутся с соответствующих складов, оприходуются на указанный склад.

На этом первый этап заканчивается. Продемонстрирован:

  • пример работы с документом ОперацияБух - пример заполнения проводок;
  • пример свертки регистра бухгалтерии Хозрасчетный по определенному счету *.

*В данном случае по счету 10.01 мы посадили остатки на одну партию. Таким способом можно сворачивать остатки по всем партиям (документам поступления и перемещений) на одну партию (специализированный документ Партия), при необходимости можно остатки по всем складам свернуть на один склад.

Переходим ко второму этапу. Также получим остатки по регистру Раздельный учет НДС, далее спишем по текущим измерениям (в том числе по текущим ключам аналитик учета) и оприходуем по измерениям (но уже по своим ключам аналитик учета) - см. листинг 2.

 
 Листинг 2. Списание и оприходование аналитик учета по регистру накопления Раздельный учет НДС 

 

//3. получим список остатков по регистру НДС Раздельный учет 		
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|	НДСРаздельныйУчетОстатки.Организация КАК Организация,
		|	НДСРаздельныйУчетОстатки.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат,
		|	НДСРаздельныйУчетОстатки.АналитикаУчетаНДС КАК АналитикаУчетаНДС,
		|	НДСРаздельныйУчетОстатки.СпособУчетаНДС КАК СпособУчетаНДС,
		|	НДСРаздельныйУчетОстатки.Партия КАК Партия,
		|	НДСРаздельныйУчетОстатки.КоличествоОстаток КАК Количество,
		|	НДСРаздельныйУчетОстатки.СуммаБезНДСОстаток КАК СуммаБезНДС,
		|	НДСРаздельныйУчетОстатки.НДСОстаток КАК НДС
		|ИЗ
		|	РегистрНакопления.НДСРаздельныйУчет.Остатки(&Период, ) КАК НДСРаздельныйУчетОстатки";
		
		Запрос.УстановитьПараметр("Период", Объект.Период);  
		
		Результат = Запрос.Выполнить();
		Выборка = Результат.Выбрать();
		
        Док = Объект.ОперацияБух.ПолучитьОбъект();
		НайденнаяСтрока = Док.ТаблицаРегистровНакопления.Найти("НДСРаздельныйУчет", "Имя"); 
		Если НайденнаяСтрока = Неопределено Тогда
			
			СтрРегистра = Док.ТаблицаРегистровНакопления.Добавить(); 
			СтрРегистра.Имя = "НДСРаздельныйУчет"; 	
			Док.Записать(); 
			
		КонецЕсли;
		
		НЗ = Док.Движения.НДСРаздельныйУчет;
		
		//4. заполним регистр НДС Раздельный учет
		Пока Выборка.Следующий() Цикл 		
			
			//расход
			Запись = НЗ.Добавить(); 
			
			Запись.Период = Объект.Период;
			Запись.ВидДвижения = ВидДвиженияНакопления.Расход;
			ЗаполнитьЗначенияСвойств(Запись, Выборка); 
			
			//приход 
			Если Выборка.Количество > 0 Тогда
				
				Запись = НЗ.Добавить(); 
				
				Запись.Период = Объект.Период;
				Запись.ВидДвижения = ВидДвиженияНакопления.Приход;
				ЗаполнитьЗначенияСвойств(Запись, Выборка);  
				
				Запись.АналитикаУчетаЗатрат = ПолучитьНовуюАналитикуУчетаЗатрат(Выборка.АналитикаУчетаЗатрат, Объект.ДокПартии, Объект.НомСубконтоПартия, Объект.ВклНовыйСклад, Объект.Склад, Объект.НомСубконтоСклад); 
				
				Если Объект.ВклНовуюСчетФактуру Тогда
					Запись.АналитикаУчетаНДС = ПолучитьНовуюАналитикуУчетаНДС(Выборка.АналитикаУчетаНДС, Объект.СчетФактура);
				КонецЕсли;
				
				Запись.Партия = Объект.ДокПартии; 
				
			КонецЕсли;
			
		КонецЦикла;
		
		НЗ.Записывать = Истина;
		НЗ.Записать();   
		

 

Как видим в листинге 2, для регистра накопления сначала делаем запись с видом Расход, затем для положительного количества делаем запись с видом Приход.

Функции по созданию аналитик отражены в том же модуле обработки, что и основная процедура заполнения проводок, но для целей описания деталей представлены в отдельном листинге 3. 

 
 Листинг 3. Программная работа с аналитиками учета
&НаСервере
Функция ПолучитьНовуюАналитикуУчетаЗатрат(АналитикаУчетаЗатрат, Партия, НомерСубконтоПартия, ВклНовыйСклад, Склад, НомСубконтоСклад)
	
	Если НЕ ЗначениеЗаполнено(АналитикаУчетаЗатрат) Тогда
		Возврат Справочники.КлючиАналитикиУчетаЗатрат.ПустаяСсылка();
	КонецЕсли;
	
	мСклад = ?(ВклНовыйСклад, Склад, АналитикаУчетаЗатрат["Субконто"+НомСубконтоСклад]);
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	КлючиАналитикиУчетаЗатрат.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.КлючиАналитикиУчетаЗатрат КАК КлючиАналитикиУчетаЗатрат
	|ГДЕ
	|	КлючиАналитикиУчетаЗатрат.Организация = &Организация
	|	И КлючиАналитикиУчетаЗатрат.СчетЗатрат = &СчетЗатрат
	|	И КлючиАналитикиУчетаЗатрат.Подразделение = &Подразделение
	|	И КлючиАналитикиУчетаЗатрат.Субконто1 = &Субконто1
	|	И КлючиАналитикиУчетаЗатрат.Субконто2 = &Субконто2
	|	И КлючиАналитикиУчетаЗатрат.Субконто3 = &Субконто3
	|	И КлючиАналитикиУчетаЗатрат.ПометкаУдаления = ЛОЖЬ";
	
	Запрос.УстановитьПараметр("Организация", АналитикаУчетаЗатрат.Организация); 
	Запрос.УстановитьПараметр("СчетЗатрат", АналитикаУчетаЗатрат.СчетЗатрат);
	Запрос.УстановитьПараметр("Подразделение", АналитикаУчетаЗатрат.Подразделение);
	Запрос.УстановитьПараметр("Субконто1", АналитикаУчетаЗатрат.Субконто1);
	Запрос.УстановитьПараметр("Субконто"+НомерСубконтоПартия, Партия); 
	Запрос.УстановитьПараметр("Субконто"+НомСубконтоСклад, мСклад);

	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();  
	
	Если Выборка.Количество() > 1 Тогда  
		
		Сообщить("Найдено несколько аналитик учета затрат с одинаковыми ключами: " + Символы.ПС
		+ АналитикаУчетаЗатрат.Организация + Символы.ПС
		+ АналитикаУчетаЗатрат.СчетЗатрат + Символы.ПС
		+ АналитикаУчетаЗатрат.Подразделение + Символы.ПС
		+ АналитикаУчетаЗатрат.Субконто1 + Символы.ПС
		+ Партия + Символы.ПС
		+ мСклад);
		
	КонецЕсли;
	
	//Если Ложь Тогда
	//	АналитикаУчетаЗатрат = Справочники.КлючиАналитикиУчетаЗатрат.СоздатьЭлемент().Ссылка;
	//КонецЕсли;

	Если Выборка.Следующий() Тогда	
		
		НоваяАналитикаУчетаЗатрат = Выборка.Ссылка.ПолучитьОбъект(); 
		
	Иначе
		
		НоваяАналитикаУчетаЗатрат = АналитикаУчетаЗатрат.ПолучитьОбъект().Скопировать();  
		
		//здесь мы задаем свою Партию и Склад
		НоваяАналитикаУчетаЗатрат["Субконто" + НомерСубконтоПартия] = Партия;
		НоваяАналитикаУчетаЗатрат["Субконто" + НомСубконтоСклад] = мСклад;
		//НоваяАналитикаУчетаЗатрат.Записать();  
		
		НоваяАналитикаУчетаЗатрат.Наименование = Справочники.КлючиАналитикиУчетаЗатрат.ПолучитьНаименованиеКлючаАналитикиУчетаЗатрат(НоваяАналитикаУчетаЗатрат);
		НоваяАналитикаУчетаЗатрат.Записать();

	КонецЕсли;  	
		
	ПараметрыАналитики = ПолучитьСтруктуруАналитикУчетаЗатрат(НоваяАналитикаУчетаЗатрат);
	СоздатьКлючАналитикиЗатрат(ПараметрыАналитики, НоваяАналитикаУчетаЗатрат.Ссылка);
	
	Возврат НоваяАналитикаУчетаЗатрат.Ссылка; 
	
КонецФункции   

&НаСервере   
Функция ПолучитьНовуюАналитикуУчетаНДС(АналитикаУчетаНДС, СчетФактура)

	Если НЕ ЗначениеЗаполнено(АналитикаУчетаНДС) Тогда
		Возврат Справочники.КлючиАналитикиУчетаНДС.ПустаяСсылка();
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	КлючиАналитикиУчетаНДС.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.КлючиАналитикиУчетаНДС КАК КлючиАналитикиУчетаНДС
	|ГДЕ
	|	КлючиАналитикиУчетаНДС.Организация = &Организация
	|	И КлючиАналитикиУчетаНДС.СчетФактура = &СчетФактура
	|	И КлючиАналитикиУчетаНДС.ВидЦенности = &ВидЦенности
	|	И КлючиАналитикиУчетаНДС.СчетУчетаНДС = &СчетУчетаНДС
	|	И КлючиАналитикиУчетаНДС.СтавкаНДС = &СтавкаНДС
	|	И КлючиАналитикиУчетаНДС.Поставщик = &Поставщик
	|	И КлючиАналитикиУчетаНДС.ИсправленныйСчетФактура = &ИсправленныйСчетФактура
	|	И КлючиАналитикиУчетаНДС.ПометкаУдаления = ЛОЖЬ";
	
	Запрос.УстановитьПараметр("Организация", АналитикаУчетаНДС.Организация);
	Запрос.УстановитьПараметр("СчетФактура", СчетФактура);
	Запрос.УстановитьПараметр("ВидЦенности", АналитикаУчетаНДС.ВидЦенности);
	Запрос.УстановитьПараметр("СчетУчетаНДС", АналитикаУчетаНДС.СчетУчетаНДС);
	Запрос.УстановитьПараметр("СтавкаНДС", АналитикаУчетаНДС.СтавкаНДС);
	Запрос.УстановитьПараметр("Поставщик", АналитикаУчетаНДС.Поставщик);
	Запрос.УстановитьПараметр("ИсправленныйСчетФактура", АналитикаУчетаНДС.ИсправленныйСчетФактура);
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	Если Выборка.Количество() > 1 Тогда  
		
		Сообщить("Найдено несколько аналитик учета НДС с одинаковыми ключами: " + Символы.ПС
		+ АналитикаУчетаНДС.Организация + Символы.ПС
		+ СчетФактура + Символы.ПС
		+ АналитикаУчетаНДС.ВидЦенности + Символы.ПС
		+ АналитикаУчетаНДС.СчетУчетаНДС + Символы.ПС  
		+ АналитикаУчетаНДС.СтавкаНДС + Символы.ПС
		+ АналитикаУчетаНДС.Поставщик);
		
	КонецЕсли;
	
	//Если Ложь Тогда
	//	АналитикаУчетаНДС = Справочники.КлючиАналитикиУчетаНДС.СоздатьЭлемент().Ссылка;
	//КонецЕсли;

	Если Выборка.Следующий() Тогда  
		
		НоваяАналитикаУчетаНДС = Выборка.Ссылка.ПолучитьОбъект();
		
	Иначе 
		
		НоваяАналитикаУчетаНДС = АналитикаУчетаНДС.ПолучитьОбъект().Скопировать(); 
		
		//здесь мы задаем свою Партию
		НоваяАналитикаУчетаНДС.СчетФактура = СчетФактура;
		//НоваяАналитикаУчетаНДС.Записать();
		
		НоваяАналитикаУчетаНДС.Наименование = Справочники.КлючиАналитикиУчетаНДС.ПолучитьНаименованиеКлючаАналитикиУчетаНДС(НоваяАналитикаУчетаНДС);
		НоваяАналитикаУчетаНДС.Записать();
	
	КонецЕсли;  		
		
	ПараметрыАналитики = ПолучитьСтруктуруАналитикУчетаНДС(НоваяАналитикаУчетаНДС);
	СоздатьКлючАналитикиНДС(ПараметрыАналитики, НоваяАналитикаУчетаНДС.Ссылка);
	
	Возврат НоваяАналитикаУчетаНДС.Ссылка; 
	
КонецФункции

&НаСервере
Функция ПолучитьСтруктуруАналитикУчетаЗатрат(АналитикаУчетаЗатрат)
	
	СтруктураАналитикУчетаЗатрат = Новый Структура("
		|Организация,
		|СчетЗатрат,
		|Подразделение,
		|Субконто1,
		|Субконто2,
		|Субконто3,
		|");
	СтруктураАналитикУчетаЗатрат.Организация 	= АналитикаУчетаЗатрат.Организация;	
	СтруктураАналитикУчетаЗатрат.СчетЗатрат 	= АналитикаУчетаЗатрат.СчетЗатрат;
	СтруктураАналитикУчетаЗатрат.Подразделение 	= АналитикаУчетаЗатрат.Подразделение;
	СтруктураАналитикУчетаЗатрат.Субконто1 		= ?(ЗначениеЗаполнено(АналитикаУчетаЗатрат.Субконто1), АналитикаУчетаЗатрат.Субконто1, Неопределено);
    СтруктураАналитикУчетаЗатрат.Субконто2 		= ?(ЗначениеЗаполнено(АналитикаУчетаЗатрат.Субконто2), АналитикаУчетаЗатрат.Субконто2, Неопределено);
	СтруктураАналитикУчетаЗатрат.Субконто3 		= ?(ЗначениеЗаполнено(АналитикаУчетаЗатрат.Субконто3), АналитикаУчетаЗатрат.Субконто3, Неопределено);
		
	Возврат СтруктураАналитикУчетаЗатрат;
	
КонецФункции

&НаСервере
Процедура СоздатьКлючАналитикиЗатрат(ПараметрыАналитики, АналитикаУчетаЗатрат)

	МенеджерЗаписи = РегистрыСведений.АналитикаУчетаЗатрат.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ПараметрыАналитики);
		
	МенеджерЗаписи.КлючАналитики = АналитикаУчетаЗатрат;
	МенеджерЗаписи.Записать(Истина);

КонецПроцедуры

&НаСервере
Функция ПолучитьСтруктуруАналитикУчетаНДС(АналитикаУчетаНДС)
	
	СтруктураАналитикУчетаНДС = Новый Структура("
		|Организация,
		|СчетФактура,
		|ВидЦенности,
		|СчетУчетаНДС,
		|СтавкаНДС,
		|Поставщик,
		|ИсправленныйСчетФактура
		|");
	СтруктураАналитикУчетаНДС.Организация 				= АналитикаУчетаНДС.Организация;
	СтруктураАналитикУчетаНДС.СчетФактура 				= АналитикаУчетаНДС.СчетФактура;
	СтруктураАналитикУчетаНДС.ВидЦенности 				= АналитикаУчетаНДС.ВидЦенности;
	СтруктураАналитикУчетаНДС.СчетУчетаНДС				= АналитикаУчетаНДС.СчетУчетаНДС;
	СтруктураАналитикУчетаНДС.СтавкаНДС 				= АналитикаУчетаНДС.СтавкаНДС;
	СтруктураАналитикУчетаНДС.Поставщик 				= АналитикаУчетаНДС.Поставщик;
	СтруктураАналитикУчетаНДС.ИсправленныйСчетФактура	= АналитикаУчетаНДС.ИсправленныйСчетФактура;
	
	Возврат СтруктураАналитикУчетаНДС;
	
КонецФункции  

&НаСервере
Процедура СоздатьКлючАналитикиНДС(ПараметрыАналитики, АналитикаУчетаНДС)

	МенеджерЗаписи = РегистрыСведений.АналитикаУчетаНДС.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ПараметрыАналитики);

	МенеджерЗаписи.КлючАналитики = АналитикаУчетаНДС;
	МенеджерЗаписи.Записать(Истина);  
	
КонецПроцедуры

 

 

Аналитику сначала ищем по ключевым полям, далее используем найденную или создаем новую аналитику копированием, а в ней изменяем реквизит, соответствующий нашей задаче по смыслу и содержанию.

В таком подходе есть большой нюанс - запрос к базе данных происходит в цикле. Для прохождения тестовых собеседований и экзаменов на сертификат 1С - такой подход не подойдет. Но для внешней обработки, которая делает 17 тыс. записей по регистру за 5 минут - подойдет. Я полагаю многие так поступают для разовых работ обработок.

Второй этап завершен. Далее проверяется проведение документов за январь 2024 г, например, Требование-накладная (Расход материалов), закрытие месяца за январь и т.д. При этом возможны ошибки "Не хватает остатков для целей учета НДС" - по складу не хватает столько-то штук... По сути это уже третий этап - отладочный - в каждой базе данных будут выявлены свои ошибки...   

Итак, по второму этапу продемонстрирован:

  • пример работы с аналитиками учета (затрат и НДС);
  • пример свертки регистра накопления "Раздельный учет НДС", который содержит в составе измерений справочные данные аналитик учета (затрат и НДС).

Что еще можно добавить? На скринах видно, что было использовано две базы - одна Демо БП Корп для подготовки и разработки обработки, вторая - копия рабочей базы БП Корп - для отладки и собственно доработки алгоритмов.  

С тем, что разработка и отладка алгоритма проводились на разных версиях БП Корп и на разных базах данных, связан еще один нюанс разработки. В Демо-базе номер субконто "Склад" = 3, а номер субконто "Партия" = 2 - по счету 10.01. В рабочей базе БП Корп наоборот: номер субконто "Склад" = 2, а номер субконто "Партия" = 3 - по счету 10.01. 

Надеюсь, кому-то пригодится. Было потрачено по 30 часов разработчика и аналитика.  

* * *

На этом все.

Всем добра! С пользой для клиентов, RustIG

 
 См. также
  1. Анализ прав и ролей. Поиск подходящего профиля - алгоритмический анализ и поиск
  2. Оцифровка и визуализация склада - программная прорисовка склада
  3. Удаление документов для любых баз на управляемых формах
  4. Удаление справочников для любых баз на управляемых и обычных формах
  5. Перенумерация документов и справочников - с учетом префиксов номеров
  6. Свертка базы УТ 10.3 подокументно - новая концепция 
  7. Матричное программирование - демо-стенд матричного калькулятора
  8. Справочное хранение товаров в КА 2.5 - кейс запуска адресного склада
  9. Мини-обзор разных задач - от очевидного до неочевидного
  10. Поиск отчета по документам - пример анализа незнакомых конфигураций
  11. Флажок в динамическом списке - от теории до практики "как бы простой" задачи
  12. Из Json в ДеревоЗначений - удобный просмотрщик json-структуры
  13. Внедрение адресного склада в КА 2.5 - кейс запуска адресного склада
  14. Фрилансеру: про цены, про клиентов, про планирование - мое исследование
  15. Что такое форматированный документ - прекрасная возможность раскрасить любой текст
  16. Программная работа с упаковками в КА 2.5 - примеры адаптаций механизмов упаковок в КА 2.5
  17. Универсальное сравнение регистров накопления - связь по измерениям, сравнение по ресурсам
  18. Обход объекта рекурсивно - просмотр реквизитов документа с бесконечным открытием подуровней

 

Проверено на следующих конфигурациях и релизах:

  • Бухгалтерия предприятия, редакция 3.0, релизы 3.0.155.21, 3.0.131.27

ОперацияБух свертка БП аналитика учета затрат аналитика учета НДС регистр Раздельный учет НДС

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    152135    834    397    

842

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    20580    59    43    

106

Инструментарий разработчика Программист Платформа 1С v8.3 Платные (руб)

OneRPA - платформа роботизации рутинных операций, в основе которой лежит платформа 1С:Предприятие. Данная платформа позволяет использовать современные технологии роботизации, не теряя при этом наработки, которые были созданы в ходе автоматизации. При этом платформа роботизации сохраняет все преимущества платформы 1С: гибкость, кроссплатформенность, мобильный и Web доступ, простоту расширения. Ну и конечно же роботы создаются и сопровождаются простыми специалистами 1С, при этом не обязательно программистами. Self hosted версия

300000 руб.

03.03.2021    14224    12    27    

36

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Бизнес-аналитик Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:ERP. Управление холдингом Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    4164    24    14    

37

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    14098    36    7    

69

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    9292    33    10    

56

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3840 руб.

14.01.2013    185648    1127    0    

899

Перенос данных 1C Оптовая торговля Свертка базы Системный администратор Программист Бухгалтер Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Хотите точно знать, что вы выгружаете? Хотите сворачивать товары по НДС или фильтровать товары по доп. реквизиту? Вы волшебник, которому необходимо превращать одних контрагентов в других? Хотите при выгрузке превратить группу товаров в один? Или просто нужен удобный OLE обмен между 1C:Управление торговлей (ред. 11 или 10) и 1С:Бухгалтерия предприятия (ред. 2 или 3). Тогда эта обработка для вас!

10900 руб.

19.04.2013    171613    360    397    

333
Отзывы
3. RustIG 1728 19.08.24 22:12 Сейчас в теме
Описанное далее - должно быть включено в статью.
1. Обработка как готовый продукт родилась не сразу, а создавалась именно методом проб и ошибок - выходили ошибки, дорабатывали обработку, снова тестировали.
2. Разработку и тестирование проводили на файловой копии рабочей базы (с отключенными регл. заданиями), сама рабочая база - клиент-серверная.
3. Одной из проверок корректности свертки (нужно было включить Партию по всем материалам) было проведение документов Расход материала (это Требование-накладная в конфигурации). При проведении Расхода материала вызываются разные проверки на наличие остатков. Очередной вызов процедуры проверки привел к запросу, который я переделал под консоль запросов, чтобы можно было удобно видеть, какие записи попадают в выборку. Может пригодиться вам:

ВЫБРАТЬ &СчетУчета КАК СчетУчета, &АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, &Номенклатура КАК Номенклатура ПОМЕСТИТЬ ТаблицаСписанныеТоварыБух ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ТаблицаСписанныеТоварыБух.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, ЕСТЬNULL(КлассификаторТНВЭД.СырьевойТовар, ЛОЖЬ) КАК ЭтоСырье, ЕСТЬNULL(СпрНоменклатура.КодРаздел7ДекларацииНДС, ЗНАЧЕНИЕ(Справочник.КодыОперацийРаздела7ДекларацииПоНДС.Пустаяссылка)) КАК КодРаздел7ДекларацииНДС, ТаблицаСписанныеТоварыБух.Номенклатура КАК Номенклатура ПОМЕСТИТЬ ВТРеквизитыНоменклатуры ИЗ ТаблицаСписанныеТоварыБух КАК ТаблицаСписанныеТоварыБух ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура ПО ТаблицаСписанныеТоварыБух.Номенклатура = СпрНоменклатура.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлассификаторТНВЭД КАК КлассификаторТНВЭД ПО (СпрНоменклатура.КодТНВЭД = КлассификаторТНВЭД.Ссылка) ИНДЕКСИРОВАТЬ ПО АналитикаУчетаЗатрат ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ &Организация КАК Организация, ТаблицаСписанныеТоварыБух.СчетУчета КАК СчетУчета, ТаблицаСписанныеТоварыБух.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат ПОМЕСТИТЬ ТаблицаСписанныхТоваров ИЗ ТаблицаСписанныеТоварыБух КАК ТаблицаСписанныеТоварыБух ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный КАК Хозрасчетный ПО ТаблицаСписанныеТоварыБух.СчетУчета = Хозрасчетный.Ссылка ГДЕ НЕ ЕСТЬNULL(Хозрасчетный.Забалансовый, ИСТИНА) ИНДЕКСИРОВАТЬ ПО Организация, АналитикаУчетаЗатрат ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ НДСРаздельныйУчетОстатки.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, НДСРаздельныйУчетОстатки.АналитикаУчетаНДС КАК АналитикаУчетаНДС, НДСРаздельныйУчетОстатки.Партия КАК Партия, НДСРаздельныйУчетОстатки.СпособУчетаНДС КАК СпособУчетаНДС, ВЫБОР КОГДА НДСРаздельныйУчетОстатки.КоличествоОстаток > 0 ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ЕстьКоличество, НДСРаздельныйУчетОстатки.КоличествоОстаток КАК Количество, НДСРаздельныйУчетОстатки.СуммаБезНДСОстаток КАК СуммаБезНДС, НДСРаздельныйУчетОстатки.НДСОстаток КАК НДС ПОМЕСТИТЬ ВТНДСРаздельныйУчетОстатки ИЗ РегистрНакопления.НДСРаздельныйУчет.Остатки( &МоментСписания, (Организация, АналитикаУчетаЗатрат) В (ВЫБРАТЬ ТаблицаСписанныхТоваров.Организация, ТаблицаСписанныхТоваров.АналитикаУчетаЗатрат ИЗ ТаблицаСписанныхТоваров)) КАК НДСРаздельныйУчетОстатки ГДЕ НДСРаздельныйУчетОстатки.СуммаБезНДСОстаток >= 0 ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ ВТНДСРаздельныйУчетОстатки.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, ВТНДСРаздельныйУчетОстатки.АналитикаУчетаНДС КАК АналитикаУчетаНДС, ВТНДСРаздельныйУчетОстатки.СпособУчетаНДС КАК СпособУчетаНДС, ВТНДСРаздельныйУчетОстатки.Партия КАК Партия, РегистрАналитикаУчетаНДС.СчетФактура КАК СчетФактура, РегистрАналитикаУчетаНДС.ВидЦенности КАК ВидЦенности, РегистрАналитикаУчетаНДС.СчетУчетаНДС КАК СчетУчетаНДС, РегистрАналитикаУчетаНДС.СтавкаНДС КАК СтавкаНДС, ВТНДСРаздельныйУчетОстатки.ЕстьКоличество КАК ЕстьКоличество, ВТНДСРаздельныйУчетОстатки.Количество КАК Количество, ВТНДСРаздельныйУчетОстатки.СуммаБезНДС КАК СуммаБезНДС, ВТНДСРаздельныйУчетОстатки.НДС КАК НДС, ЕСТЬNULL(РеквизитыДокументаСчетФактура.ДатаРегистратора, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаСФ, ЕСТЬNULL(РеквизитыДокументаПартии.ДатаРегистратора, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПартии, ВЫБОР КОГДА ЕСТЬNULL(РеквизитыДокументаСчетФактура.ДатаРегистратора, ДАТАВРЕМЯ(1, 1, 1)) < ДАТАВРЕМЯ(2016, 7, 1) ТОГДА ИСТИНА ИНАЧЕ ВТРеквизитыНоменклатуры.ЭтоСырье КОНЕЦ КАК БлокироватьДоПодтвержденияСтавки0, ВТРеквизитыНоменклатуры.КодРаздел7ДекларацииНДС КАК КодРаздел7ДекларацииНДС, ВТРеквизитыНоменклатуры.Номенклатура КАК Номенклатура, ЕСТЬNULL(РегистрАналитикаУчетаНДС.Поставщик, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК Поставщик, ЕСТЬNULL(РегистрАналитикаУчетаНДС.ИсправленныйСчетФактура, ЗНАЧЕНИЕ(Документ.КорректировкаПоступления.ПустаяСсылка)) КАК ИсправленныйСчетФактура ИЗ ВТНДСРаздельныйУчетОстатки КАК ВТНДСРаздельныйУчетОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНДС КАК РегистрАналитикаУчетаНДС ПО ВТНДСРаздельныйУчетОстатки.АналитикаУчетаНДС = РегистрАналитикаУчетаНДС.КлючАналитики ЛЕВОЕ СОЕДИНЕНИЕ ВТРеквизитыНоменклатуры КАК ВТРеквизитыНоменклатуры ПО ВТНДСРаздельныйУчетОстатки.АналитикаУчетаЗатрат = ВТРеквизитыНоменклатуры.АналитикаУчетаЗатрат ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПервичныхДокументов КАК РеквизитыДокументаПартии ПО (РеквизитыДокументаПартии.Организация = &Организация) И ВТНДСРаздельныйУчетОстатки.Партия = РеквизитыДокументаПартии.Документ ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПервичныхДокументов КАК РеквизитыДокументаСчетФактура ПО (РеквизитыДокументаСчетФактура.Организация = &Организация) И (РегистрАналитикаУчетаНДС.СчетФактура = РеквизитыДокументаСчетФактура.Документ)
Показать


4. Консоль запроса показала, что при проведении Расхода материала тянутся все дубли ключей аналитики учета (!!!) Даже помеченные на удаление. Главное, чтобы ключевые поля совпадали.
Да, согласен, надо написать в отдел разработки и т.д.и т.п.

В результате этой итерации разработки и тестирования, в обработку добавился поиск ключей аналитик учета по ключевым полям. Далее восстановили копию рабочей базы - запустили снова обработку - теперь не создавались дубли ключей...

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

В результате такой итерации разработки и тестирования , в обработку добавилось в создание новой аналитики учета не только создание нового элемента справочника, но запись в одноименный регистр сведений.

Такое поведение с точки зрения архитектуры имеющихся таблиц мною до конца не понято. Для меня пока не оправдано. Ставлю под сомнение и на паузу этот предмет обсуждения.

ПС. Примерно подобное было, когда я разбирался с программной работой единиц измерения и упаковок в КА (есть статья) - архитектура решения мне была не понятна (зачем именно так), но в результате отнесся к этому философски - принял и использовал то, что предлагают разработчики типовых... Так и живем...
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aximo 2088 19.08.24 20:23 Сейчас в теме
Миллион лет назад, я занимался подобной игрой с партиями и операциямиБух - напишу так - ведение партионного учета в бух может быть обусловлено с большой вероятностью только прихотью главного бухгалтера - никакой необходимой нагрузки тогда и, вероятно, сейчас, это не будет нести...

ну а если по делу:

1.Пишешь, что используешь КОРП - но я не увидел заполнения подразделений в проводках

2. создание документа операции я бы "обернул" в начать/зафиксироватьтранзакцию()

вот можете изучить мои "игры" с данным механизмом:

https://infostart.ru/1c/tools/401853/

или

https://infostart.ru/1c/tools/89152/
2. RustIG 1728 19.08.24 20:48 Сейчас в теме
(1)
только прихотью главного бухгалтера
- гособоронзаказ

Пишешь, что используешь КОРП - но я не увидел заполнения подразделений в проводках

подразделений нет - сам удивляюсь

я бы "обернул" в начать/зафиксироватьтранзакцию()
- согласен, не спорю
БП КОРП (клиент-серверная), технологическое окно - вся ночь, регл . задания не мешали, обработка отрабатывает за 5 минут

ПС. сама обработка как готовый продукт родилась не сразу, а создавалась именно методом проб и ошибок - выходили ошибки, дорабатывали обработку...

вот можете изучить мои "игры" с данным механизмом
- да , спасибо, пусть будет.
Я постарался подробно описать технологию - основная цель, а не только выложить обработку, при чем не универсальную во всех смыслах

СПАСИБО за адекватный комментарий, коллега
Прикрепленные файлы:
3. RustIG 1728 19.08.24 22:12 Сейчас в теме
Описанное далее - должно быть включено в статью.
1. Обработка как готовый продукт родилась не сразу, а создавалась именно методом проб и ошибок - выходили ошибки, дорабатывали обработку, снова тестировали.
2. Разработку и тестирование проводили на файловой копии рабочей базы (с отключенными регл. заданиями), сама рабочая база - клиент-серверная.
3. Одной из проверок корректности свертки (нужно было включить Партию по всем материалам) было проведение документов Расход материала (это Требование-накладная в конфигурации). При проведении Расхода материала вызываются разные проверки на наличие остатков. Очередной вызов процедуры проверки привел к запросу, который я переделал под консоль запросов, чтобы можно было удобно видеть, какие записи попадают в выборку. Может пригодиться вам:

ВЫБРАТЬ &СчетУчета КАК СчетУчета, &АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, &Номенклатура КАК Номенклатура ПОМЕСТИТЬ ТаблицаСписанныеТоварыБух ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ТаблицаСписанныеТоварыБух.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, ЕСТЬNULL(КлассификаторТНВЭД.СырьевойТовар, ЛОЖЬ) КАК ЭтоСырье, ЕСТЬNULL(СпрНоменклатура.КодРаздел7ДекларацииНДС, ЗНАЧЕНИЕ(Справочник.КодыОперацийРаздела7ДекларацииПоНДС.Пустаяссылка)) КАК КодРаздел7ДекларацииНДС, ТаблицаСписанныеТоварыБух.Номенклатура КАК Номенклатура ПОМЕСТИТЬ ВТРеквизитыНоменклатуры ИЗ ТаблицаСписанныеТоварыБух КАК ТаблицаСписанныеТоварыБух ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура ПО ТаблицаСписанныеТоварыБух.Номенклатура = СпрНоменклатура.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлассификаторТНВЭД КАК КлассификаторТНВЭД ПО (СпрНоменклатура.КодТНВЭД = КлассификаторТНВЭД.Ссылка) ИНДЕКСИРОВАТЬ ПО АналитикаУчетаЗатрат ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ &Организация КАК Организация, ТаблицаСписанныеТоварыБух.СчетУчета КАК СчетУчета, ТаблицаСписанныеТоварыБух.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат ПОМЕСТИТЬ ТаблицаСписанныхТоваров ИЗ ТаблицаСписанныеТоварыБух КАК ТаблицаСписанныеТоварыБух ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный КАК Хозрасчетный ПО ТаблицаСписанныеТоварыБух.СчетУчета = Хозрасчетный.Ссылка ГДЕ НЕ ЕСТЬNULL(Хозрасчетный.Забалансовый, ИСТИНА) ИНДЕКСИРОВАТЬ ПО Организация, АналитикаУчетаЗатрат ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ НДСРаздельныйУчетОстатки.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, НДСРаздельныйУчетОстатки.АналитикаУчетаНДС КАК АналитикаУчетаНДС, НДСРаздельныйУчетОстатки.Партия КАК Партия, НДСРаздельныйУчетОстатки.СпособУчетаНДС КАК СпособУчетаНДС, ВЫБОР КОГДА НДСРаздельныйУчетОстатки.КоличествоОстаток > 0 ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ЕстьКоличество, НДСРаздельныйУчетОстатки.КоличествоОстаток КАК Количество, НДСРаздельныйУчетОстатки.СуммаБезНДСОстаток КАК СуммаБезНДС, НДСРаздельныйУчетОстатки.НДСОстаток КАК НДС ПОМЕСТИТЬ ВТНДСРаздельныйУчетОстатки ИЗ РегистрНакопления.НДСРаздельныйУчет.Остатки( &МоментСписания, (Организация, АналитикаУчетаЗатрат) В (ВЫБРАТЬ ТаблицаСписанныхТоваров.Организация, ТаблицаСписанныхТоваров.АналитикаУчетаЗатрат ИЗ ТаблицаСписанныхТоваров)) КАК НДСРаздельныйУчетОстатки ГДЕ НДСРаздельныйУчетОстатки.СуммаБезНДСОстаток >= 0 ; ////////////////////////////////////////////////////////////­//////////////////// ВЫБРАТЬ ВТНДСРаздельныйУчетОстатки.АналитикаУчетаЗатрат КАК АналитикаУчетаЗатрат, ВТНДСРаздельныйУчетОстатки.АналитикаУчетаНДС КАК АналитикаУчетаНДС, ВТНДСРаздельныйУчетОстатки.СпособУчетаНДС КАК СпособУчетаНДС, ВТНДСРаздельныйУчетОстатки.Партия КАК Партия, РегистрАналитикаУчетаНДС.СчетФактура КАК СчетФактура, РегистрАналитикаУчетаНДС.ВидЦенности КАК ВидЦенности, РегистрАналитикаУчетаНДС.СчетУчетаНДС КАК СчетУчетаНДС, РегистрАналитикаУчетаНДС.СтавкаНДС КАК СтавкаНДС, ВТНДСРаздельныйУчетОстатки.ЕстьКоличество КАК ЕстьКоличество, ВТНДСРаздельныйУчетОстатки.Количество КАК Количество, ВТНДСРаздельныйУчетОстатки.СуммаБезНДС КАК СуммаБезНДС, ВТНДСРаздельныйУчетОстатки.НДС КАК НДС, ЕСТЬNULL(РеквизитыДокументаСчетФактура.ДатаРегистратора, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаСФ, ЕСТЬNULL(РеквизитыДокументаПартии.ДатаРегистратора, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПартии, ВЫБОР КОГДА ЕСТЬNULL(РеквизитыДокументаСчетФактура.ДатаРегистратора, ДАТАВРЕМЯ(1, 1, 1)) < ДАТАВРЕМЯ(2016, 7, 1) ТОГДА ИСТИНА ИНАЧЕ ВТРеквизитыНоменклатуры.ЭтоСырье КОНЕЦ КАК БлокироватьДоПодтвержденияСтавки0, ВТРеквизитыНоменклатуры.КодРаздел7ДекларацииНДС КАК КодРаздел7ДекларацииНДС, ВТРеквизитыНоменклатуры.Номенклатура КАК Номенклатура, ЕСТЬNULL(РегистрАналитикаУчетаНДС.Поставщик, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК Поставщик, ЕСТЬNULL(РегистрАналитикаУчетаНДС.ИсправленныйСчетФактура, ЗНАЧЕНИЕ(Документ.КорректировкаПоступления.ПустаяСсылка)) КАК ИсправленныйСчетФактура ИЗ ВТНДСРаздельныйУчетОстатки КАК ВТНДСРаздельныйУчетОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНДС КАК РегистрАналитикаУчетаНДС ПО ВТНДСРаздельныйУчетОстатки.АналитикаУчетаНДС = РегистрАналитикаУчетаНДС.КлючАналитики ЛЕВОЕ СОЕДИНЕНИЕ ВТРеквизитыНоменклатуры КАК ВТРеквизитыНоменклатуры ПО ВТНДСРаздельныйУчетОстатки.АналитикаУчетаЗатрат = ВТРеквизитыНоменклатуры.АналитикаУчетаЗатрат ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПервичныхДокументов КАК РеквизитыДокументаПартии ПО (РеквизитыДокументаПартии.Организация = &Организация) И ВТНДСРаздельныйУчетОстатки.Партия = РеквизитыДокументаПартии.Документ ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПервичныхДокументов КАК РеквизитыДокументаСчетФактура ПО (РеквизитыДокументаСчетФактура.Организация = &Организация) И (РегистрАналитикаУчетаНДС.СчетФактура = РеквизитыДокументаСчетФактура.Документ)
Показать


4. Консоль запроса показала, что при проведении Расхода материала тянутся все дубли ключей аналитики учета (!!!) Даже помеченные на удаление. Главное, чтобы ключевые поля совпадали.
Да, согласен, надо написать в отдел разработки и т.д.и т.п.

В результате этой итерации разработки и тестирования, в обработку добавился поиск ключей аналитик учета по ключевым полям. Далее восстановили копию рабочей базы - запустили снова обработку - теперь не создавались дубли ключей...

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

В результате такой итерации разработки и тестирования , в обработку добавилось в создание новой аналитики учета не только создание нового элемента справочника, но запись в одноименный регистр сведений.

Такое поведение с точки зрения архитектуры имеющихся таблиц мною до конца не понято. Для меня пока не оправдано. Ставлю под сомнение и на паузу этот предмет обсуждения.

ПС. Примерно подобное было, когда я разбирался с программной работой единиц измерения и упаковок в КА (есть статья) - архитектура решения мне была не понятна (зачем именно так), но в результате отнесся к этому философски - принял и использовал то, что предлагают разработчики типовых... Так и живем...
4. RustIG 1728 20.08.24 11:15 Сейчас в теме
Добавил в обработку (но код в статье не изменял):
НачатьТранзакцию();

Попытка
	//алгоритм в листинге 1 и 2 
Исключение
	ОтменитьТранзакцию();
	Сообщить(ИнформацияОбОшибке().Описание);
КонецПопытки;	

Если ТранзакцияАктивна() Тогда
	ЗафиксироватьТранзакцию();
КонецЕсли;

Показать
Оставьте свое сообщение