Филимонов Иван | Руководитель группы автоматизации учета | ООО "Трансстроймеханизация"

«Менеджер потоков: Реализация «любой» задачи в потоках»

Реализация «любой» задачи в потоках: Обработка коллекции (например: запись\перезапись элементов справочников\документов, формирование сложных отчетов и т.д.); Обработка зависимых объектов (например, восстановление последовательности, формирование цепочек документов и т.д.). Платформа одна – задач много Единый подход к многопоточным задачам; Вся логика задачи – отдельно («любой» модуль БД / внешняя обработка); Взаимодействие через события. Доп функционал: Контроль за «падением» потоков и их рестарт; Поддержка многократных попыток обработать объект; Возможность оперативно получать «ответ» от потоков; Возможность в любой момент прервать работу; Мониторинг деятельности «Менеджера потоков».

Отчет отрабатывает до определенной даты.

1. jeniks 22.12.16 14:18 Сейчас в теме
Этот отчет формирует информацию о задолженности только до ноября 2015г. Как только период с декабря 2015г. ошибка типа:
Поле агрегатного объекта не обнаружено (СрокПлатежа)
Бух. итоги на 4 квартал 2016г. установлены.

Функция ПолучитьДокументы(ТекКА,Т,Знач Д1,Знач Д2, СальдоКон=0)

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

	Возврат ?(Опл=1,СальдоНач,Оплата);
	
КонецФункции	

//*******************************************
Процедура Сформировать()                
	КА=СоздатьОбъект("Справочник.Контрагенты"); 
	Сп=СоздатьОбъект("СписокЗначений");
	Если ВыбКА.Выбран()=1 Тогда
		Если ВыбКА.ЭтоГруппа()=1 Тогда
			КА.ВыбратьЭлементы(0);
			Пока КА.ПолучитьЭлемент()=1 Цикл
				Если КА.ЭтоГруппа()=1 Тогда
					Продолжить;
				КонецЕсли;
				Если КА.ПринадлежитГруппе(ВыбКА)=0 Тогда
					Продолжить;
				КонецЕсли;     
				Сп.ДобавитьЗначение(КА.ТекущийЭлемент());
			КонецЦикла;
		Иначе
			Сп.ДобавитьЗначение(ВыбКА);
		КонецЕсли;	
	Иначе	
		КА.ВыбратьЭлементы(0);
		Пока КА.ПолучитьЭлемент()=1 Цикл
			Если КА.ЭтоГруппа()=1 Тогда
				Продолжить;
			КонецЕсли;
			Сп.ДобавитьЗначение(КА.ТекущийЭлемент());
		КонецЦикла;
	КонецЕсли;
	Сп.Сортировать();
	ДопТаб=СоздатьОбъект("ТаблицаЗначений");
	ДопТаб.НоваяКолонка("Долг","Число",15,2);
	ДопТаб.НоваяКолонка("Дата","Дата");
	ДопТаб.НоваяКолонка("Документ","Документ");
	ДопТаб.НоваяКолонка("ДатаПогашения","Дата");

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


Процедура ПриОткрытии()
	Таблица.Опции(0,0,2,0,"ДолгиПоКА1","ДолгиПоКА2");
    Таблица.ТолькоПросмотр(1); 
	ДатаРасч=РабочаяДата();
	СрокОплаты=30;

		
КонецПроцедуры //ПриОткрытии


Показать
Найденные решения
10. jeniks 26.01.17 10:17 Сейчас в теме
Разобрался, Если Ит.ВыполнитьЗапрос(Д1,Д2,"62.0",,,1,"операция","С")=0 Тогда
Операция была, а уже Проводка. :)
Остальные ответы
Сортировка: Древо
2. antz 22.12.16 14:29 Сейчас в теме
Значит, в декабре 15 года проводки делались документом, у которого нет реквизита СрокПлатежа.
3. jeniks 22.12.16 14:40 Сейчас в теме
Вот именно что учет не менялся. Как проверить можно?
4. antz 22.12.16 14:46 Сейчас в теме
Отладчиком. Как вариант - обернуть в попытку и посмотреть на каком документе спотыкается.
5. jeniks 22.12.16 15:18 Сейчас в теме
Разобрался с именем документа.
Вопрос в другом: определяю дату документа:
Функция ПолучитьДокументы(ТекКА,Т,Знач Д1,Знач Д2, СальдоКон=0)

хочу получить проводки:
Если Ит.ВыполнитьЗапрос(Д1,Д2,"62.0",, 1,, "С")=0 Тогда
Ошибка:
Неверно задана периодичность запроса!
Хотя отладчиком: Д1-22.11.16 Д2-22.12.16.
9. YNik 22.12.16 20:35 Сейчас в теме
(5)
Если Ит.ВыполнитьЗапрос(Д1,Д2,"62.0",, 1,, "С")=0 Тогда

пропущена запятая, т.е "С" попала а периодичность:
Если Ит.ВыполнитьЗапрос(Д1,Д2,"62.0",,,1,, "С")=0 Тогда 
6. jeniks 22.12.16 15:32 Сейчас в теме
Бух итоги рассчитал на 1 кв 2017. и ошибка:
Неправильно задан период!
7. Frogger1971 22.12.16 15:41 Сейчас в теме
Таб.НоваяКолонка("Дата","Дата");


почитай, что в 1С является зарезервированными словами, тогда и, смотри, отчет нормально заработает
8. Denis_CFO 9 22.12.16 20:03 Сейчас в теме
(7) а почему он раньше работал? слова не резервировались? я с 7.7 не работал просто никогда.
10. jeniks 26.01.17 10:17 Сейчас в теме
Разобрался, Если Ит.ВыполнитьЗапрос(Д1,Д2,"62.0",,,1,"операция","С")=0 Тогда
Операция была, а уже Проводка. :)
Оставьте свое сообщение

Вакансии

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 70 000 руб. до 90 000 руб.
Полный день

Консультант-аналитик 1С
Санкт-Петербург
зарплата от 50 000 руб. до 65 000 руб.
Полный день

Консультант по внедрению 1С
Новосибирск
Полный день

Программист 1С
Новокузнецк
зарплата от 55 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 70 000 руб. до 110 000 руб.
Полный день