8.х Почему при получении записи регистра сведений и е последующей записи идет задвоение значений

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем MyNameNoName, 26 мар 2014.

  1. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Почему при получении записи регистра сведений и е последующей записи идет задвоение значений? Спасибо
    Код:
    Выборка=РегистрыСведений.АналитикаУчета.Выбрать();
       Пока Выборка.Следующий() Цикл
         Объект=Выборка.ПолучитьМенеджерЗаписи();
         Если Объект.Поставщик=ЗаменяемыйКонтрагент Тогда
           Объект.Поставщик=ЗаменяющийКонтрагент;
           Объект.Договор=ЗаменяющийДоговор;
           Объект.Записать();
    
  2. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    описание метода ПолучитьМенеджерЗаписи почитайте в синтаксис помошнике, конкретно вот тут обратите внимание
    MyNameNoName нравится это.
  3. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    А как правильно код написать:
    Объект=Выборка.ПолучитьМенеджерЗаписи().Прочитать();
    ошибка:
    {Форма.Форма.Форма(12)}: Обращение к процедуре объекта как к функции (Прочитать)
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Прочитайте до конца в СП про метод Прочитать(), особенно про доступность.
    MyNameNoName нравится это.
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Это все делает черезх набор записей. Получаете набор записей, прочить его и вперед потом записать. В Синтаксис помошнике есть код

    Код:
    КурсыВалют = РегистрыСведений.КурсыВалют;
    НаборКурсов = КурсыВалют.СоздатьНаборЗаписей();
    Доллар = Справочники.Валюты.НайтиПоНаименованию("USD");
    НаборКурсов.Отбор.Валюта.Установить(Доллар);
    НаборКурсов.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
    НаборКурсов.Прочитать();
    Если НаборКурсов.Количество() = 0 Тогда НовыйКурс = НаборКурсов.Добавить();
    НовыйКурс.Валюта = Доллар;
    НовыйКурс.Период = ТекущаяДата();
    ИначеЕсли НаборКурсов.Количество() = 1 Тогда НовыйКурс = НаборКурсов[0];
    Иначе Текст = "ru = ""Курс валюты задается один раз в день."";"
    + " en = ""Rate is set once a day.""";
    Предупреждение(НСтр(Текст), 60);
    Возврат;
    КонецЕсли;
    Последнее редактирование модератором: 26 мар 2014
    MyNameNoName нравится это.
  6. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
    Объект=Выборка.ПолучитьМенеджерЗаписи();
    Объект.Прочитать();
    не советую в качестве названия переменных использовать зарезервированные слова... мало ли
    MyNameNoName нравится это.
  7. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    А я сделал проще:
    Код:
    Если Объект.Поставщик=ЗаменяемыйКонтрагент Тогда
           Объект.Прочитать();
           Объект.Поставщик=ЗаменяющийКонтрагент;
           Объект.Договор=ЗаменяющийДоговор;
           Объект.Записать();
    
    Я сделал проще, так можно? По крайней мере работает. Я ведь перебираю весь справочник в цикле, мне кажется так логичнее.
    --- Объединение сообщений, 26 мар 2014 ---
    Спасибо.
  8. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Вообще правильней было бы получить все записи (ссылки), через запрос с типом ВЫБРАТЬ РАЗРЕШЕННЫЕ, и отбором не Группа и Вашим
    А потом уже обходить выборку запроса получать объект и его менять при необходимости.
    Просто обычно на контрагентов и их договора действуют ограничения на уровне записей - таки образом это Вам не даст ошибки по доступу
    MyNameNoName нравится это.
  9. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Видимо по этому у меня и теряются записи для которых запись заканчивается неудачей.
    Спасибо.
    --- Объединение сообщений, 26 мар 2014 ---
    А как через запрос для регистра получить ссылку? Это же не документ.
  10. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    А вы думаете только документ имеет ссылку ?????? Курите матчасть, молодой человек.
  11. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Очень нужна помощь. Как получить ссылку?
    --- Объединение сообщений, 26 мар 2014 ---
    Смотрю и не могу понять что в отличии от документов ссылка для регистров.
    --- Объединение сообщений, 26 мар 2014 ---
    Регистр не периодический.
  12. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Я предлагал типа вот такого варика


    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | *
    |ИЗ
    | РегистрСведений.КурсыВалют КАК КурсыВалют
    |ГДЕ
    | (КурсыВалют.Период >= ДАТАВРЕМЯ(2005, 1, 1)
    | ИЛИ
    | НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""USD"")
    | И
    | НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""EUR""))";
    ТаблицаОставляемыхЗаписей = Запрос.Выполнить().Выгрузить();
    
    НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    НаборЗаписей.Загрузить(ТаблицаОставляемыхЗаписей);
    ////Тут обработка набора
    НаборЗаписей.Записать()
    ;
    --- Объединение сообщений, 26 мар 2014 ---
    А то что имеет ввиду Алекс это типа вот такого варианта

    есть запрос а уже после запроса типа такого

    Код:
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Запись = РегистрыСведений.ОтветственныеЛицаОрганизации.СоздатьМенеджерЗаписи();
    
    Пока Выборка.Следующий() Цикл
    Запись.Период = Выборка.Период;
    Запись.СтруктурнаяЕдиница = Выборка.СтруктурнаяЕдиница;
    Запись.ОтветственноеЛицо = Выборка.ОтветственноеЛицо;
    
    Запись.Прочитать();
    
    Если Запись.Выбран() Тогда
    Запись.Период = Дата(2004, 1, 1);
    Запись.Записать();
    КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры
    ;
    Последнее редактирование: 26 мар 2014
    MyNameNoName нравится это.
  13. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    На правах важного офтопа::: Draco, какой пример вы подаете... офоормляйте код тегами...
  14. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    ДА у меня в опере нет кнопки оформления кода как это было до перехода. Честно искал 10 мин потом забил
    --- Объединение сообщений, 26 мар 2014 ---
    Нашел - Она в ставке :)
  15. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Сижу ломаю голову что не так, если есть у кого-нибудь возможность посмотрите что не так. Еще раз спасибо.
    Код:
    Запрос = Новый Запрос;
       Запрос.Текст = "ВЫБРАТЬ
        |   дсАналитикаУчета.Номенклатура,
        |   дсАналитикаУчета.Партия,
        |   дсАналитикаУчета.Поставщик,
        |   дсАналитикаУчета.Договор,
        |   дсАналитикаУчета.КлючАналитики
        |ИЗ
        |   РегистрСведений.дсАналитикаУчетаКАК дсАналитикаУчета";
       ТаблицаОставляемыхЗаписей = Запрос.Выполнить().Выгрузить();
    
       НаборЗаписей = РегистрыСведений.дсАналитикаУчета.СоздатьНаборЗаписей();
       НаборЗаписей.Загрузить(ТаблицаОставляемыхЗаписей);
       НаборЗаписей.Записать();
    
       Результат = Запрос.Выполнить();
       Выборка = Результат.Выбрать();
    
       Запись = РегистрыСведений.дсАналитикаУчета.СоздатьМенеджерЗаписи();
       Пока Выборка.Следующий() Цикл
         Запись.Номенклатура = Выборка.Номенклатура;
         Запись.Партия = Выборка.Партия;
         Запись.Поставщик = Выборка.Поставщик;
         Запись.Договор = Выборка.Договор;
         Запись.КлючАналитики = Выборка.КлючАналитики;
    
         Запись.Прочитать();
    //упростил код чтобы записывало все все равно не работает!
         Запись.Записать();
    
    --- Объединение сообщений, 26 мар 2014 ---
    До этого записи терялись, а сейчас вообще без изменений.
  16. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    работайте с Набором записей
    MyNameNoName нравится это.
  17. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Что неправильно в коде:
    Код:
      Запрос = Новый Запрос;
       Запрос.Текст = "ВЫБРАТЬ
        |   дсАналитикаУчета.Номенклатура,
        |   дсАналитикаУчета.Партия,
        |   дсАналитикаУчета.Поставщик,
        |   дсАналитикаУчета.Договор,
        |   дсАналитикаУчета.КлючАналитики
        |ИЗ
        |   РегистрСведений.дсАналитикаУчета КАК дсАналитикаУчета";
       ТаблицаОставляемыхЗаписей = Запрос.Выполнить().Выгрузить();
    
       Результат = Запрос.Выполнить();
       Выборка = Результат.Выбрать();
    
       Пока Выборка.Следующий() Цикл
         
         Если Выборка.Поставщик=ЗаменяемыйКонтрагент Тогда
           Записать=РегистрыСведений.дсАналитикаУчета.СоздатьМенеджерЗаписи();
           Записать.Номенклатура = Выборка.Номенклатура;
           Записать.Партия = Выборка.Партия;
           Записать.Поставщик = Выборка.Поставщик;
           Записать.Договор = Выборка.Договор;
           Записать.КлючАналитики = Выборка.КлючАналитики;
           Записать.Прочитать();
           Если Записать.Выбран()=Истина Тогда
             Записать.Поставщик = ЗаменяющийКонтрагент;
             Записать.Договор = ЗаменяющийДоговор;
             Записать.Записать();
           КонецЕсли;
         КонецЕсли;
          
       КонецЦикла;
    
    заменяется, но в случае если после замены в клиенте выдало бы ошибку тут просто удаляет эту строку. ЧТо я сделал не так? Не могу понять.
    Последнее редактирование: 26 мар 2014
  18. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    По другому способу вообще не меняются у меня значения, где-то ошибся
    Код:
    НаборЗаписей = РегистрыСведений.дсАналитикаУчета.СоздатьНаборЗаписей();
       НаборЗаписей.Загрузить(ТаблицаОставляемыхЗаписей);
       НаборЗаписей.Отбор.Поставщик.Установить(ЗаменяемыйКонтрагент);
       НаборЗаписей.Прочитать();
       Для Каждого Элемент Из НаборЗаписей Цикл
         Элемент.Поставщик=ЗаменяющийКонтрагент;
         Элемент.Договор=ЗаменяющийДоговор;
       КонецЦикла;
       Попытка
         НаборЗаписей.Записать();
       Исключение
       КонецПопытки;
    
  19. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Но ведь по этому методу значение все равно без предупреждения удаляется.
  20. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Я вот в последнем вашем коде не совсем понял зачем Вы отбор делаете?
    Вы либо в запросе все отборы делайте, а потом его грузите либо сразу бериет енабор и делайте отбор и прочитать.
    Обратите внимание что в том коде который я Вам привел там после того как результат запроса загрузили, нет Прочитать (). Ну это все излишки
    Вам я советую просто начать спростого как делают все - это конструкция типа

    Код:
    КурсыВалют = РегистрыСведений.КурсыВалют;
    НаборКурсов = КурсыВалют.СоздатьНаборЗаписей();
    Доллар = Справочники.Валюты.НайтиПоНаименованию("USD");
    НаборКурсов.Отбор.Валюта.Установить(Доллар);
    НаборКурсов.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
    НаборКурсов.Прочитать();
    MyNameNoName нравится это.

Поделиться этой страницей