Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
25 ноя 2024, 07:08

Проблемы при записи в регистр сведений при помощи СоздатьНаборЗаписей

Автор Greiv, 04 мар 2015, 16:40

0 Пользователей и 1 гость просматривают эту тему.

Greiv

Приветствую, есть обработка из которой в структуру выгружаются все параметры включая таблицу в таблицу значений и передаётся в фоновое задание, всё работает записи пишутся в регистр, но иногда бывает такое, что во время записи происходит ошибка не связанная с кодом а просто там какая нибудь кривая запись, и потом исправив её нужно дописать, так вот при попытке дописать недостающие записи прежде чем дописать недостающие записи он начинает проверять все записи которые уже записанны и перед этим  есть галочка которая исключает уже записанные данные вот код.
Процедура НазначитьКурьеровНаСервереФон(Параметры, Адрес) Экспорт

НаборЗаписей = РегистрыСведений.КурьерыЛицевыхСчетов.СоздатьНаборЗаписей();

Для каждого ТекСтрока из Параметры.ТЗ Цикл
Если ТекСтрока.Отметка Тогда
Курьер           = ПолучитьКурьераПоКодуКурьера(ТекСтрока.КодКурьера);
ТекКодКурьера = ТекСтрока.КодКурьера;
Улица            = Справочники.Улицы.НайтиПоНаименованию(ТекСтрока.Улица);
НаселенныйПункт  = Справочники.НаселенныеПункты.НайтиПоНаименованию(ТекСтрока.НаселенныйПункт);
НомерДомаСтрокой = ТекСтрока.Дом;
НомерДомаЧислом  = 0;
КорпусСтрокой_1 = "";

Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(НомерДомаСтрокой) Тогда
Попытка
НомерДомаЧислом = Число(СтрЗаменить(НомерДомаСтрокой,Символы.НПП, ""));
Исключение
НомерДомаЧислом = 0;
КонецПопытки;

Иначе
НомерДомаСтрокой_1 =  НомерДомаСтрокой;

НомерДомаСтрокой_1 = СтрЗаменить(НомерДомаСтрокой_1,"/","*");
НомерДомаСтрокой_1 = СтрЗаменить(НомерДомаСтрокой_1,"\","*");
НомерДомаСтрокой_1 = СтрЗаменить(ВРЕГ(НомерДомаСтрокой_1),"А","*");
НомерДомаСтрокой_1 = СтрЗаменить(ВРЕГ(НомерДомаСтрокой_1),"Б","*");
НомерДомаСтрокой_1 = СтрЗаменить(ВРЕГ(НомерДомаСтрокой_1),"Г","*");
НомерДомаСтрокой_1 = СтрЗаменить(ВРЕГ(НомерДомаСтрокой_1),"Д","*");
НомерДомаСтрокой_1 = СтрЗаменить(ВРЕГ(НомерДомаСтрокой_1),"Е","*");

Попытка
НомерДомаЧислом = Число(Лев(НомерДомаСтрокой_1,Найти(НомерДомаСтрокой_1,"*")-1));
Исключение
НомерДомаЧислом = 0;
КонецПопытки;   

КорпусСтрокой_1 =  Сред(НомерДомаСтрокой,Найти(НомерДомаСтрокой_1,"*"));

КорпусСтрокой_1 = СтрЗаменить(КорпусСтрокой_1,"/","");
КорпусСтрокой_1 = СтрЗаменить(КорпусСтрокой_1,"\","");

КонецЕсли;



//Если Параметры.ИсключитьЛицевыеСчетаСКурьерами Тогда
//
// Запрос = Новый Запрос;
// Запрос.Текст =
// "ВЫБРАТЬ
// | КурьерыЛицевыхСчетов.ЛицевойСчет
// |ИЗ
// | РегистрСведений.КурьерыЛицевыхСчетов КАК КурьерыЛицевыхСчетов
// |";
//
// ТаблицаЛицевых = Запрос.Выполнить().Выгрузить();
//
// МассивЛицевыхСчетов = ТаблицаЛицевых.ВыгрузитьКолонку("ЛицевойСчет");
//
//КонецЕсли;

ТекстЗапроса="";
Запрос = Новый Запрос;
ТекстЗапроса =  ТекстЗапроса+
"ВЫБРАТЬ
| &КодКурьера КАК КодКурьера,
| &Курьер КАК Курьер,
| АдресаЛицевыхСчетов.ЛицевойСчет,
| АдресаЛицевыхСчетов.БанковскийСчет,
| АдресаЛицевыхСчетов.Индекс,
| АдресаЛицевыхСчетов.ТипНаселенногоПункта,
| АдресаЛицевыхСчетов.НаселенныйПункт,
| АдресаЛицевыхСчетов.Район,
| АдресаЛицевыхСчетов.ТипУлицы,
| АдресаЛицевыхСчетов.Улица,
| АдресаЛицевыхСчетов.НомерДома,
| АдресаЛицевыхСчетов.НомерКвартиры,
| АдресаЛицевыхСчетов.ТипПомещения,
| АдресаЛицевыхСчетов.ИндексЧислом,
| АдресаЛицевыхСчетов.Регион,
| АдресаЛицевыхСчетов.Корпус,
| АдресаЛицевыхСчетов.Телефон,
| АдресаЛицевыхСчетов.НомерКвартирыЧислом,
| АдресаЛицевыхСчетов.НомерДомаЧислом,
| АдресаЛицевыхСчетов.РасчетныйПериод
|ИЗ
| РегистрСведений.АдресаЛицевыхСчетов КАК АдресаЛицевыхСчетов";
Если Параметры.ИсключитьЛицевыеСчетаСКурьерами Тогда
ТекстЗапроса=ТекстЗапроса + "
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурьерыЛицевыхСчетов КАК КурьерыЛицевыхСчетов
| ПО АдресаЛицевыхСчетов.ЛицевойСчет = КурьерыЛицевыхСчетов.ЛицевойСчет";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса+"
|ГДЕ
| АдресаЛицевыхСчетов.Улица = &Улица
| И АдресаЛицевыхСчетов.НомерДомаЧислом = &НомерДомаЧислом
| И АдресаЛицевыхСчетов.РасчетныйПериод = &РасчетныйПериод
| И АдресаЛицевыхСчетов.НаселенныйПункт = &НаселенныйПункт
| И АдресаЛицевыхСчетов.Корпус = &Корпус";

Если Не  Параметры.Почтамт = Неопределено Тогда
ТекстЗапроса = ТекстЗапроса + "
| И АдресаЛицевыхСчетов.ИндексЧислом МЕЖДУ &ИндексЧисломОТ И &ИндексЧисломДО";
КонецЕсли;

Если Параметры.ИсключитьЛицевыеСчетаСКурьерами Тогда
ТекстЗапроса = ТекстЗапроса+ "
| И КурьерыЛицевыхСчетов.ЛицевойСчет ЕСТЬ NULL";
КонецЕсли;

КонецЕсли;

//Если Параметры.ИсключитьЛицевыеСчетаСКурьерами Тогда
// ТекстЗапроса = ТекстЗапроса+"
// | И НЕ АдресаЛицевыхСчетов.ЛицевойСчет В (&ЛицевыеСчета)";
//КонецЕсли;


Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НомерДомаЧислом", НомерДомаЧислом);
Запрос.УстановитьПараметр("НаселенныйПункт", НаселенныйПункт);
Запрос.УстановитьПараметр("Улица",           Улица);
Запрос.УстановитьПараметр("Корпус",          КорпусСтрокой_1);
Запрос.УстановитьПараметр("Курьер",          Курьер);
Запрос.УстановитьПараметр("РасчетныйПериод", Параметры.РасчетныйПериод);
Запрос.УстановитьПараметр("КодКурьера",      ТекКодКурьера);

Если Не  Параметры.Почтамт = Неопределено Тогда
Запрос.УстановитьПараметр("ИндексЧисломОТ", Параметры.ИндексОТ);
Запрос.УстановитьПараметр("ИндексЧисломДО", Параметры.ИндексДО);
КонецЕсли;
//Если Параметры.ИсключитьЛицевыеСчетаСКурьерами Тогда
// Запрос.УстановитьПараметр("ЛицевыеСчета",МассивЛицевыхСчетов);
//КонецЕсли;

ТЗ_Результат = Запрос.Выполнить().Выгрузить();
НаборЗаписей.Загрузить(ТЗ_Результат);
НаборЗаписей.Записать(Ложь);

КонецЦикла;

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

Очень сложно тут описать всё, но почемуто при отработке запроса и выгрузке его в ТЗ всё ровно начинает пересчитываться все записи, а только потом начинают писаться недостающие.

vitasw

 Для каждого ТекСтрока из Параметры.ТЗ Цикл
....
Запрос=...
КонецЦикла;
Это уже ни в какие ворота не лезет.
Где индусы живут, судя по коду - вы явно в курсе.

LexaK

полностью присоединяюсь к vitasw, так писать программы нельзя!
как она вообще у вас работает?

в цикле у вас есть условие, проверка отметки, но после него всегда выполняется запрос и запись в регистр (?)

Если в первой строке вашей ТЗ, будет Отметка = Ложь, то у вас вообще должна ошибка возникать.


Для каждого ТекСтрока из Параметры.ТЗ Цикл
    Если ТекСтрока.Отметка Тогда
        //...
    КонецЕсли;
           
            //Если Параметры.ИсключитьЛицевыеСчетаСКурьерами Тогда           
            //    ТекстЗапроса = ТекстЗапроса+"
            //    |    И НЕ АдресаЛицевыхСчетов.ЛицевойСчет В (&ЛицевыеСчета)";
            //КонецЕсли;                   
           
           
            Запрос.Текст = ТекстЗапроса;               
            Запрос.УстановитьПараметр("НомерДомаЧислом", НомерДомаЧислом);
            Запрос.УстановитьПараметр("НаселенныйПункт", НаселенныйПункт);
            Запрос.УстановитьПараметр("Улица",           Улица);
            Запрос.УстановитьПараметр("Корпус",          КорпусСтрокой_1);
            Запрос.УстановитьПараметр("Курьер",          Курьер);
            Запрос.УстановитьПараметр("РасчетныйПериод", Параметры.РасчетныйПериод);
            Запрос.УстановитьПараметр("КодКурьера",      ТекКодКурьера);
           
            Если Не  Параметры.Почтамт = Неопределено Тогда
                Запрос.УстановитьПараметр("ИндексЧисломОТ", Параметры.ИндексОТ);
                Запрос.УстановитьПараметр("ИндексЧисломДО", Параметры.ИндексДО);
            КонецЕсли;
            //Если Параметры.ИсключитьЛицевыеСчетаСКурьерами Тогда             
            //    Запрос.УстановитьПараметр("ЛицевыеСчета",МассивЛицевыхСчетов);
            //КонецЕсли;   
           
                ТЗ_Результат = Запрос.Выполнить().Выгрузить();   
                НаборЗаписей.Загрузить(ТЗ_Результат);
                НаборЗаписей.Записать(Ложь);
           
    КонецЦикла;



по правильному, план действия такой
1. в цикле подготовить/обработать нужные поля вашей ТЗ
2. Переписать запрос, передать туда в параметрах вашу ТЗ, и к ней подобрать все данные.
3. выполнить Запрос ОДИН раз, результат поместить в набор записей,
4. ОДИН раз записать набор данных в регистр.

вроде бы все элементарно
если помогло нажмите: Спасибо!

Greiv

ДА вчера сам разбирался, проблема явно в цикле и там действительно ещё несколько процедур которые я тут не описывал, спасибо за помощь. Просто без цикла врятле получится, но буду пробовать.
Добавлено: 05 мар 2015, 11:32


Цитировать
по правильному, план действия такой
1. в цикле подготовить/обработать нужные поля вашей ТЗ
2. Переписать запрос, передать туда в параметрах вашу ТЗ, и к ней подобрать все данные.
3. выполнить Запрос ОДИН раз, результат поместить в набор записей,
4. ОДИН раз записать набор данных в регистр.

вроде бы все элементарно

Есть ещё одна проблема, почему то когда не все записи в передаваемой ТЗ отмеченны, мне вываливается ошибка:
Значение не является значением объектного типа (Текст)
         Запрос.Текст = ТекстЗапроса;

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск