B
Brenli
Доброго времени.
1С 7.7 ТиС
В связи с огромным размером БД возникла необходимость в обрезке базы, стандартная обработка свёртки плохо работает так как конфа не типовая, и готовить базу к свёртке делая профилактику занимающую неделю по времени,....времени нет.....
Решил написать загрузку выгрузку товарных остатков , остатков по кассе и взаиморасчёты.
Так как учёт в организации партионный важно знать от какого поставщика какой товар. Проблемма в следующем: остатки я получил очень просто с помощью запроса, а вот с партиями беда.....данные из регистра партии в наличии ....мягко скажем кривые, и данные оттуда брать проблемно.
Написал процедуру .. Выгрузил итоги запроса к остаткам в таблицу значений, после этого запустил цикл по всем строкам этой таблицы (ТЗ)
далее запустил вложенный цикл по документам поступления в обратном порядке (от большей даты до меньшей) .....получаем документ, выгружаем его табличную часть в таблицу значений, далее в этой таблице ищем текущую строку таблицы значений, если находим заполняем поставщика для данной позиции и переходим к другой строке
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Прошу посмотреть опытных и проверить
1С 7.7 ТиС
В связи с огромным размером БД возникла необходимость в обрезке базы, стандартная обработка свёртки плохо работает так как конфа не типовая, и готовить базу к свёртке делая профилактику занимающую неделю по времени,....времени нет.....
Решил написать загрузку выгрузку товарных остатков , остатков по кассе и взаиморасчёты.
Так как учёт в организации партионный важно знать от какого поставщика какой товар. Проблемма в следующем: остатки я получил очень просто с помощью запроса, а вот с партиями беда.....данные из регистра партии в наличии ....мягко скажем кривые, и данные оттуда брать проблемно.
Написал процедуру .. Выгрузил итоги запроса к остаткам в таблицу значений, после этого запустил цикл по всем строкам этой таблицы (ТЗ)
далее запустил вложенный цикл по документам поступления в обратном порядке (от большей даты до меньшей) .....получаем документ, выгружаем его табличную часть в таблицу значений, далее в этой таблице ищем текущую строку таблицы значений, если находим заполняем поставщика для данной позиции и переходим к другой строке
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
Процедура СформироватьДанныеПоТоварам(ДБФ)
ДокПост = СоздатьОБъект("Документ.ПоступлениеТМЦ");
ТЗ = СоздатьОБъект("ТаблицаЗначений");
// **************Запрос к регистру остатков***********************
Запрос = СоздатьОБъект("ЗАпрос");
ТекстЗапроса = "
|С НачДата По НачДата;
|Фирма = Регистр.ОстаткиТМЦ.Фирма;
|Склад = Регистр.ОстаткиТМЦ.Склад;
|Товар = Регистр.ОстаткиТМЦ.Номенклатура;
|Количество = Регистр.ОстаткиТМЦ.Количество;
// |Поставщик = Регистр.ОстаткиТМЦ.ТекущийДокумент.ПоступлениеТМЦ.Контрагент;
|Группировка Товар Без Групп;
|Группировка Фирма Без Групп;
|Группировка Склад Без Групп;
|Функция КОст = КонОст(Количество);
//|Условие (Фирма = ВыбФирма);
//|Условие (ВыбСклад = Склад);
|";
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат;
КонецЕсли;
Если Запрос.Выгрузить(ТЗ,0,0)=0 Тогда
Возврат;
КонецЕсли;
// *************Добавим к таблице 3 колонки*******************************
ТЗ.НоваяКолонка("ЦенаЗак","Число",10,2);
ТЗ.НоваяКолонка("Флаг","Число",1);
ТЗ.НоваяКолонка("Поставщик","Справочник.Контрагенты");
// *********Найдём последнего поставщика от которого приходил товар******************
ТЗ.ВыбратьСтроки();
Сч = 0;
_Булево = 0;
_СтрПоиска = 0;
_ТоварБуфер = "";
_КонтрБуфер = "";
_ЦенаЗакБуфер = 0;
ТЗ_Док = СоздатьОбъект("ТаблицаЗначений");
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Сч = Сч + 1;
//====================================================
//Добавил установку значения из буфера чтобы не перебирать лишний раз документы
// в случае если товар идентичен но фирма и склад различны
Если ТЗ.Товар = _ТоварБуфер Тогда
ТЗ.УстановитьЗначение(Сч,"Поставщик",_КонтрБуфер);
ТЗ.УстановитьЗначение(Сч,"Флаг",1);
ТЗ.УстановитьЗначение(Сч,"ЦенаЗак",_ЦенаЗакБуфер);
Сообщить("<<<< Установлен поставщик из буфера "+ ТЗ.Товар);
Продолжить;
КонецЕсли;
//====================================================
ДокПост.ОбратныйПорядок(1);
ДокПост.ВыбратьДокументы();
Пока ДокПост.ПолучитьДокумент()=1 Цикл
ТЗ_Док.УдалитьСтроки();
СчСтр = 0;
ДокПост.ВыгрузитьТабличнуюЧасть(ТЗ_Док);
Если Тз_Док.НайтиЗначение(ТЗ.Товар,СчСтр,"Номенклатура")=0 Тогда
Продолжить;
Иначе
ТЗ.УстановитьЗначение(Сч,"Поставщик",ДокПост.Контрагент);
ТЗ.УстановитьЗначение(Сч,"Флаг",1);
ТЗ.УстановитьЗначение(Сч,"ЦенаЗак",Тз_Док.ПолучитьЗначение(СчСтр,"Цена"));
_ЦенаЗакБуфер = Тз_Док.ПолучитьЗначение(СчСтр,"Цена");
_ТоварБуфер = ТЗ.Товар;
_КонтрБуфер = ДокПост.Контрагент;
Сообщить(" Установлен флаг <1> "+Тз_Док.ПолучитьЗначение(СчСтр,"Номенклатура"));
Прервать;
КонецЕсли;
КонецЦикла;
Если ТЗ.Итог("Флаг")=ТЗ.КоличествоСтрок() Тогда
Сообщить(" !!ALERT!! Cработало условие выхода ");
Прервать; //цикл по документам
КонецЕсли;
Сообщить(Сч);
КонецЦикла;
//***********Заполним файл базы данных скомпоноваными значениями***************
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
ДБФ.Добавить();
ДБФ.Name = Строка(ТЗ.Товар);
ДБФ.Firma = Строка(ТЗ.Фирма);
ДБФ.Sklad = Строка(ТЗ.Склад);
ДБФ.Kontr = Строка(ТЗ.Поставщик);
ДБФ.Cena = ТЗ.ЦенаЗак;
ДБФ.Flag = ТЗ.Флаг;
ДБФ.Записать();
КонецЦикла;
КонецПроцедуры //СформироватьДанныеПоТоварам()
//******************************************************************************
// Выгрузить()
//
// Параметры:
//
//
// Возвращаемое значение:
// Нет
//
// Описание:
// ТекстОписания
//
Процедура Выгрузить()
НачатьТранзакцию();
//************Структура файла БД для Товаров*****************
ДБФ = Создатьобъект("XBase");
ДБФ.ДобавитьПоле("Name", 2,100,);
ДБФ.ДобавитьПоле("Firma", 2,100,);
ДБФ.ДобавитьПоле("Sklad", 2,100,);
ДБФ.ДобавитьПоле("Cena", 1,15,2);
ДБФ.ДобавитьПоле("Kontr", 2,100,);
ДБФ.ДобавитьПоле("Flag", 1,1,);
ДБФ.СоздатьФайл("C:\dbUpload.dbf");
ДБФ.Записать();
СформироватьДанныеПоТоварам(ДБФ);
/////////////////////////////////////////////////////////////
//************Структура файла БД для расчёты Покупатели******
ДБФПок = Создатьобъект("XBase");
ДБФПок.ДобавитьПоле("Kontr", 2,100,);
ДБФПок.ДобавитьПоле("Firma", 2,100,);
ДБФПок.ДобавитьПоле("Dolg", 1,15,2);
//
//ДБФПок.СоздатьФайл("C:\dbPokup.dbf");
//ДБФПок.Записать();
//ВзаиморасчетыПокупатели(ДБФПок);
/////////////////////////////////////////////////////////////
//************Структура файла БД для расчёты Поставщики******
ДБФПост = Создатьобъект("XBase");
ДБФПост.ДобавитьПоле("Kontr", 2,100,);
ДБФПост.ДобавитьПоле("Firma", 2,100,);
ДБФПост.ДобавитьПоле("Dolg", 1,15,2);
//ДБФПост.СоздатьФайл("C:\dbPo3st.dbf");
//ДБФПост.Записать();
//ВзаиморасчетыПоставщики(ДБФПост);
/////////////////////////////////////////////////////////////
//ОстаткиПоКассе();
ЗафиксироватьТранзакцию();
КонецПроцедуры //Выгрузить()
Прошу посмотреть опытных и проверить