Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
18 Дек 2017, 18:37
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Проблемы при записи в регистр сведений при помощи СоздатьНаборЗаписей  (Прочитано 1916 раз)

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

Оффлайн Greiv

  • *
  • Сообщений: 37
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-07-09
  • Сайт: 
  • Профессия: Ученик 1С
Приветствую, есть обработка из которой в структуру выгружаются все параметры включая таблицу в таблицу значений и передаётся в фоновое задание, всё работает записи пишутся в регистр, но иногда бывает такое, что во время записи происходит ошибка не связанная с кодом а просто там какая нибудь кривая запись, и потом исправив её нужно дописать, так вот при попытке дописать недостающие записи прежде чем дописать недостающие записи он начинает проверять все записи которые уже записанны и перед этим  есть галочка которая исключает уже записанные данные вот код.
Процедура НазначитьКурьеровНаСервереФон(Параметры, Адрес) Экспорт		

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

Для каждого ТекСтрока из Параметры.ТЗ Цикл
Если ТекСтрока.Отметка Тогда
Курьер           = ПолучитьКурьераПоКодуКурьера(ТекСтрока.КодКурьера);
ТекКодКурьера = ТекСтрока.КодКурьера;
Улица            = Справочники.Улицы.НайтиПоНаименованию(ТекСтрока.Улица);
НаселенныйПункт  = Справочники.НаселенныеПункты.НайтиПоНаименованию(ТекСтрока.НаселенныйПункт);
НомерДомаСтрокой = ТекСтрока.Дом;
НомерДомаЧислом  = 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

  • *****
  • Сообщений: 2575
  • РЕПУТАЦИЯ: 311
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
 Для каждого ТекСтрока из Параметры.ТЗ Цикл
....
Запрос=...
 КонецЦикла;
Это уже ни в какие ворота не лезет.
Где индусы живут, судя по коду - вы явно в курсе.

Оффлайн LexaK

  • *****
  • Сообщений: 1267
  • РЕПУТАЦИЯ: 347
  • КПД: 27%
  • Регистрация: 2012-05-16
  • Сайт: 
  • Профессия: Программист 1С
полностью присоединяюсь к vitasw, так писать программы нельзя!
как она вообще у вас работает?

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

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

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


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

вроде бы все элементарно
Помогло? - Нажми СПАСИБО!!!
                       :)

Оффлайн Greiv

  • *
  • Сообщений: 37
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-07-09
  • Сайт: 
  • Профессия: Ученик 1С
ДА вчера сам разбирался, проблема явно в цикле и там действительно ещё несколько процедур которые я тут не описывал, спасибо за помощь. Просто без цикла врятле получится, но буду пробовать.
Добавлено: 05 Мар 2015, 11:32

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

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

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

Последний раз редактировалось: Greiv; 05 Мар 2015, 11:32. Причина: Объединение сообщений


Теги:
 

Отличие проводки по регистру сведений от проводки по регистру накопления?

Автор DirecTwiXРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 4858
Последний ответ 18 Апр 2012, 02:19
от Dethmontt
Добавление сведений в графу "основание" документа "ТОРГ-12"

Автор Ярослав1984Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 4
Просмотров: 7764
Последний ответ 20 Авг 2013, 18:45
от Ярослав1984
Как можно подставлять цену из регистра сведений "Цены поставщиков" в документ"ПоступлениеТоваров" на актуальную дату? Необходимо использовать запрос в решении.

Автор Елена6666666666Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 14
Просмотров: 9394
Последний ответ 24 Окт 2014, 13:30
от cska-fanat-kz
В чем отличие регистра сведений от регистра накопления?

Автор Dmitry QweРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 533
Последний ответ 11 Сен 2017, 10:50
от ilyay
Проверка на "новую" запись в рег. сведений

Автор nomer13Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 6
Просмотров: 14383
Последний ответ 11 Янв 2011, 10:04
от nomer13

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
140 Сообщений
AIFrame
70 Сообщений
ilyay ilyay
65 Сообщений
alex0402
51 Сообщений
andron81_81
44 Сообщений
oleg-x
41 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
BuhRust
31 Сообщений
Golickoff Golickoff
27 Сообщений
alexandr_ll
23 Сообщений

* Кто онлайн

  • Точка Гостей: 400
  • Точка Скрытых: 0
  • Точка Пользователей: 5
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal