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

8.2 обычное приложение, не перезаписывает регистры (Код внутри)

Автор acces969, 27 дек 2015, 14:08

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

acces969

Здравствуйте. Не могу понять почему не перезаписываются регистры. Цикл крутится, значение присваивается, но после цикла все становится как было. Системные процедуры "перед записью" пропускают запись... Неужели поле "регистратор" у регистра невозможно перезаписать? Вставьте код у себя, пожалуйста, проверьте... Потому что гуглил я, все что можно сделать - пробовал.

// Запись.Регистратор - ссылка на документ-регистратор
// СсылкаНаОбъединенныйДокумент - ссылка на документ, который должен стать регистратором этой записи
      РедактированиеДвижений = строка.ссылка.ПолучитьОбъект().Движения;      
       Для Каждого НаборЗаписейРегистра из РедактированиеДвижений Цикл
        НаборЗаписейРегистра.Прочитать();
            НаборЗаписейРегистра.Записывать = истина;
        Для Каждого Запись из НаборЗаписейРегистра Цикл   
     
           Запись.Регистратор = СсылкаНаОбъединенныйДокумент;
           
      КонецЦикла;
      НаборЗаписейРегистра.Записать();
         КонецЦикла;

1Cnastroika

Если нужно изменить регистратор у движений документа то создайте новые движения у нужного документа и очистите движения у старого документа.

acces969

Цитата: 1Cnastroika от 27 дек 2015, 14:30
Если нужно изменить регистратор у движений документа то создайте новые движения у нужного документа и очистите движения у старого документа.
Не думаю что такой вариант подойдет. Условие заказчика было изменение записей, а не удаление и создание новых. На случай ошибок в базе - чтобы их ошибки остались их ошибками, а не нашими.

1Cnastroika

Зачем менять регистратор у движений регистра? Если Вы создадите новые движения точно такие же, как были у старого документа, то клиент даже не будет знать, каким способом Вы решили его задачу.

acces969

Цитата: 1Cnastroika от 27 дек 2015, 15:01
Зачем менять регистратор у движений регистра? Если Вы создадите новые движения точно такие же, как были у старого документа, то клиент даже не будет знать, каким способом Вы решили его задачу.
Тут даже три ответа.
Во первых, дело принципиальное - лучше изменить существующие, чем пересоздавать. Уж очень сложная эта система, Управление торговым предприятием, а база - сети магазинов поварешек и прочей бытовой утвари, с оборотом по 200 - 300 документов в день. Если не дай бог что будет криво заполнятся, за неделю там столько ошибок будет, что исправить свои косяки будет практически невозможно.
Тут и во вторых - это моя первое оффициальное задание, у меня недостаточно опыта работы с движениями документов, чтобы уверенно составить план действий в голове.
Ну и в третьих - не знаю, как будут вести себя движения при создании, если база уже была с ошибками (не хватает товара на складе, а документ проведен был, я создаю движение - копию, а он не создается из за ошибки базы)

Андрей Сисюкин

Цитата: acces969 от 27 дек 2015, 15:29
Цитата: 1Cnastroika от 27 дек 2015, 15:01
Зачем менять регистратор у движений регистра? Если Вы создадите новые движения точно такие же, как были у старого документа, то клиент даже не будет знать, каким способом Вы решили его задачу.
Тут даже три ответа.
Во первых, дело принципиальное - лучше изменить существующие, чем пересоздавать. Уж очень сложная эта система, Управление торговым предприятием, а база - сети магазинов поварешек и прочей бытовой утвари, с оборотом по 200 - 300 документов в день. Если не дай бог что будет криво заполнятся, за неделю там столько ошибок будет, что исправить свои косяки будет практически невозможно.
Тут и во вторых - это моя первое оффициальное задание, у меня недостаточно опыта работы с движениями документов, чтобы уверенно составить план действий в голове.
Ну и в третьих - не знаю, как будут вести себя движения при создании, если база уже была с ошибками (не хватает товара на складе, а документ проведен был, я создаю движение - копию, а он не создается из за ошибки базы)

1Cnastroika - правиьно ответил(а).
Во-первых, ты пытаешься изменить регистратор в наборе другого документа - заметь это. При запись этого набора - регистратор проставляется этого набора.
Нужно создать -отдельный- набор записей = копия текущего, изменить как хочешь, записать, а старый удалить.

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

По коду: НаборЗаписейРегистра.Прочитать(); - по моему это лишее..

acces969

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

Андрей, Спасибо за ваш ответ(подтверждающий совет 1сТastroika, за который ему тоже спасибо). Флаг стоит.
(работа моей обработки такая - реализованные и проведенные документы объединять в одни, группируя по реквизитам, старые оригинальные доки ставить флагом "архивный" и блокировать их изменение, объединенные - тоже самое. И те, и другие документы не проводятся и не снимаются с проводок - их движения должны переходить из архивных в объединенные. Тоесть архивные и обьединенные документы - просто пустышки, не отображающиеся в системе и не доступные для изменения. Цель этого - ускорение работы базы. На данный момент обработка уже готова, осталось только с движениями разобратся. Кстати, коэффициент сжатия количества документов - от 3.5 до 10 раз, так как во всей сети магазинов доки заполняются по шаблону, в качестве контрагента почти всегда выступает частное лицо, а основное различие - "подразделение" и "менеджер")
Как я уже понял, поменять регистратора у записей невозможно, поэтому на данный момент делаю копирование. И почему то выходит ошибка "не установлен отбор по регистратору", при попытке записи. Подскажите, где подправить код? (регистратор.установить() - не помогает)

ДокИсточник = строка.ссылка.ПолучитьОбъект().Движения;
Для каждого Набор Из ДокИсточник Цикл
  Набор.Прочитать();
       
  НаборТекущегоОбъекта = Движения[Набор.Метаданные().Имя];
       
  Для каждого ЗаписьНабора Из Набор Цикл
   
    НоваяЗапись = НаборТекущегоОбъекта.Добавить();
   НоваяЗапись.Регистратор = ссылкаНаОбъединенныйДокумент;
    НоваяЗапись.Активность  = ЗаписьНабора.Активность;   
  ЗаполнитьЗначенияСвойств(НоваяЗапись, ЗаписьНабора);
           
   
  КонецЦикла;
//  Движения[Набор.Метаданные().Имя].Записать();
  Набор.Записать();
КонецЦикла;
Добавлено: 27 дек 2015, 18:47


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

ИмяРегистра = Движения[Набор.Метаданные().Имя];
НаборТекущегоОбъекта = ИмяРегистра.СоздатьНаборЗаписей();
Добавлено: 27 дек 2015, 18:56


Подробнее - вот ошибка
{Документ.РеализацияТоваровУслуг.Форма.ОбъединениеДокументов.Форма(962)}: Метод объекта не обнаружен (СоздатьНаборЗаписей)
  НаборТекущегоОбъекта = ИмяРегистра.СоздатьНаборЗаписей();


Вот код

ДокИсточник = строка.ссылка.ПолучитьОбъект().Движения;
Для каждого Набор Из ДокИсточник Цикл
  Набор.Прочитать();
             
  ИмяРегистра = Метаданные.НайтиПоПолномуИмени(СтрЗаменить(Строка(Движения[Набор.Метаданные().Имя]),"НаборЗаписей","")) ;
  НаборТекущегоОбъекта = ИмяРегистра.СоздатьНаборЗаписей();
  НаборТекущегоОбъекта.Отбор.Регистратор.Установить(ссылкаНаОбъединенныйДокумент);     
  Для каждого ЗаписьНабора Из Набор Цикл
   
    НоваяЗапись = НаборТекущегоОбъекта.Добавить();
    НоваяЗапись.Активность  = ЗаписьНабора.Активность;   
  ЗаполнитьЗначенияСвойств(НоваяЗапись, ЗаписьНабора,,"регистратор");
         
   
КонецЦикла;
НаборТекущегоОбъекта.Записать();
КонецЦикла;

Добавлено: 27 дек 2015, 19:16


Простите за флуд... я бы удалил тут то что намусорил, но помоему редактирование собственных сообщений тут невозможно. Я уже справился и с этим вопросом, ответ вот -
РегистрыНакопления[Набор.Метаданные().Имя] , и, очевидно, справлюсь и со следующими проблемами. Да простят меня модераторы... Всем спасибо
Добавлено: 27 дек 2015, 20:41


Рабочий код, передаю потомкам, придущим с гугла

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

НаборСоздДока.Записать(Ложь);
Набор.Записать(Истина);
КонецЦикла;

1Cnastroika

Цитата: acces969 от 27 дек 2015, 18:25

Как я уже понял, поменять регистратора у записей невозможно,

Эта строка кода неправильная, но по сути Вы хотели сделать так

    ДокументОбъект.Движения.ОстаткиТоваров.Регистратор = ДругойРегистратор;

Думаю смысл понятен.

Теги:

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

Рейтинг@Mail.ru

Поиск