8.х Документ реализация

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Xon, 25 апр 2015.

  1. TopicStarter Overlay
    Xon
    Offline

    Xon

    Регистрация:
    25 апр 2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте, Форумчане. Нужна помощь.
    Стоит такая задача: сделать документ реализация, который автоматически (при создании/открытии документа) заполняет табличную часть из регистра сведений на текущую дату, либо на ту дату, которую укажет пользователь (регистр сведений заполняется пользователем и имеет две колонки период и сама номенклатура). На форме имеется только три первые колонки (№, Точка продаж(контрагент) и Адрес) остальные колонки создаются программно (на каждую номенклатуру на дату из регистра сведений своя колонка (ручка, карандаш и т.п.), т.е. сколько пользователь забьет в регистр сведений номенклатуры столько и будет колонок(на текущую дату). В общем с созданием колонок проблем нет, но проблема в том, что нужно всю эту таблицу хранить виртуально (при записи, естественно ничего не сохраняется, кроме первых трех колонок).
    Вот код:
    Код:
    Если ДокументОбъект.ЭтоНовый() Тогда
         
       Запрос = Новый Запрос;
       Запрос.Текст =
         "ВЫБРАТЬ
         |   СписокНоменклатурыСрезПоследних.Номенклатура,
         |   СписокНоменклатурыСрезПоследних.Период,
         |   ЦеныНоменклатурыСрезПоследних.Цена
         |ИЗ
         |   РегистрСведений.СписокНоменклатуры.СрезПоследних(&Дата, ) КАК СписокНоменклатурыСрезПоследних
         |     ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних
         |     ПО СписокНоменклатурыСрезПоследних.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
    
       Запрос.УстановитьПараметр("Дата", Дата);
       Результат    = Запрос.Выполнить();
       Выборка    = Результат.Выбрать();
         
       Пока Выборка.Следующий() Цикл
         Если Дата = Выборка.Период Тогда
           КолонкаТЧ         = ЭлементыФормы.Товары.Колонки.Добавить();
           КолонкаТЧ.ТекстШапки    = Строка("" + Выборка.Номенклатура + ", " + Выборка.Цена + "");
           КолонкаТЧ.УстановитьЭлементУправления(Тип("ПолеВвода"));
         КонецЕсли;
       КонецЦикла;
         
         КолонкаТЧ         = ЭлементыФормы.Товары.Колонки.Добавить();
         КолонкаТЧ.ТекстШапки    = "Периодичность закупа";
         КолонкаТЧ.УстановитьЭлементУправления(Тип("ПолеВвода"));
         КолонкаТЧ         = ЭлементыФормы.Товары.Колонки.Добавить();
         КолонкаТЧ.ТекстШапки    = "День недели закупа";
         КолонкаТЧ.УстановитьЭлементУправления(Тип("ПолеВвода"));
         КолонкаТЧ         = ЭлементыФормы.Товары.Колонки.Добавить("Контакты");
         КолонкаТЧ.УстановитьЭлементУправления(Тип("ПолеВвода"));
         КолонкаТЧ         = ЭлементыФормы.Товары.Колонки.Добавить("Сумма");
         КолонкаТЧ.УстановитьЭлементУправления(Тип("ПолеВвода"));
       КонецЕсли;
    
    При повторном открытии документа табличная часть должна собираться в таком же порядке в каком записывал пользователь.
    1С 8.2, обычное приложение
  2. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Если честно, то я не совсем понял вашу логику. 1С, в понятие "табличной части" заложила другое предназначение. Ну да ладно. Не понятен Ваш вопрос.
    Если только в этом, то в регистре добавьте еще один ресурс "порядок" и сортируйте по нему результат запроса и они всегда будут в одном порядке. Только придется немного дописать обработку записи в этот регистр, чтобы порядок проставлялся.
  3. TopicStarter Overlay
    Xon
    Offline

    Xon

    Регистрация:
    25 апр 2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Вот как-то так это должно выглядеть:
    [​IMG]
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Задачу понял смутно.

    Храните все данные в этой табличной части.
    На форму документа эту табличную часть не надо выносить. На форму документа поместить табличное поле и заполнять/записывать в него данные программно.
    То что я написал выше вероятно вам не понятно.
    Чтобы уловить как оно сделано рекомендую разобрать из типовой конфигурации УТ 10.3 (КА, УПП) как сделан и работает документ Установка цен номенклатуры (это ваш случай: в документе хранятся произвольное количество строк и заранее неизвестное (динамически задаваемое) количество колонок (типов цен в случае этого документа)).
    Xon нравится это.
  5. TopicStarter Overlay
    Xon
    Offline

    Xon

    Регистрация:
    25 апр 2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Возникла проблема с записью документа. Имеется 2 табличные части: ТаблицаНоменклатуры(там только номенклатура) и Товары(все остальное). Делаю по аналогии с документом Установка цен номенклатуры.
    Код:
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
      
        Товары.Очистить();
        КоличествоСтрок = ВизуальныеТовары.Количество() - 1;
        Для Стр = 0 По КоличествоСтрок Цикл
            СтрокаТаблицыНоменклатуры = ВизуальныеТовары[Стр];
            Для Каждого СтрокаТоваров Из Товары Цикл
              
                НоваяСтрока = Товары.Добавить();
                НоваяСтрока.Номенклатура                 = СтрокаТоваров.Номенклатура;
                НоваяСтрока.ТочкаПродаж                   = СтрокаТоваров.ТочкаПродаж;
                НоваяСтрока.Адрес                               = СтрокаТоваров.Адрес;
                НоваяСтрока.ПериодичностьЗакупа    = СтрокаТоваров.ПериодичностьЗакупа;
                НоваяСтрока.ДеньНеделиЗакупа         = СтрокаТоваров.ДеньНеделиЗакупа;
                НоваяСтрока.Контакты                          = СтрокаТоваров.Контакы;
            КонецЦикла;
        КонецЦикла;
      
    КонецПроцедуры
    
    ВизуальныеТовары - табличное поле.
  6. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Вы нормально объясните, что хотите сделать?! Ваш код-полный бред. Без обид.
  7. TopicStarter Overlay
    Xon
    Offline

    Xon

    Регистрация:
    25 апр 2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Окей. Я программно создаю колонки (туда соответственно вводится информация). Но так как на табличном поле нет этих колонок, то данные надо где-то хранить. Вот я и пытаюсь записывать это в табличную часть.
  8. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Если Вы пытаетесь записывать данные в табличную часть, то у Вас априори колонки будут предопределены. Соответственно, ваше табличное поле, где Вы формируете программно колонки отпадает. Если честно, то у меня в голове не может уложиться связь табличной части, регистра сведений, документа реализации, программного создания колонок и т.д. Поймите, написать программный код, это пустяковое дело. Самая большая проблема это его отладка. Другими словами это то, чтобы заставить Ваш код работать так как действительно нужно и без ошибок. А также, скажу по своему опыту. Для меня самой распространенной проблемой, с которой сталкивался я и многие мои коллеги, так это понимание задания программистом. Заказчик не может внятно объяснить чего он хочет. Простите, но сейчас происходит тоже самое. Только в роли заказчика выступаете Вы. Мы Вам с радостью подскажем и как правильно код написать и как лучше сделать, только если Вы объясните что хотите сделать и для чего это Вам нужно. Цель форума носит информационно-поучительный характер. Передача знаний. Обмен опытом и т.д.
    P.S. Что-то накипело. ):. Надеюсь Вы меня поняли.
    Xon нравится это.
  9. TopicStarter Overlay
    Xon
    Offline

    Xon

    Регистрация:
    25 апр 2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Хорошо. Начну с начала.)
    В общем задание такое: Сделать документ реализации.
    При создании нового документа появляются колонки (контрагент, адрес, сумма и др.) и на эту дату появляется ВСЯ номенклатура вбитая в регистр сведений (на эту дату соответственно, для этого он и нужен). Так как заранее неизвестно количество номенклатуры (колонок под неё), то колонки создаются программно, НО есть табличная часть, с соответствующими реквизитами (контрагент, адрес, сумма и др.).
    Так вот с созданием колонок все нормально, они создаются, данные вбиваются, но эти данные надо где-то хранить, а так как на форме нет этих колонок (там просто расположено табличное поле), то хранить данные надо в табличной части и выводить их на форму. Вот в этом для меня и заключается проблема.
    Надеюсь на этот раз понятно объяснил. )
  10. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Честно, опять не понял вашу логику. Документ реализации делает следующее. Он отражает факт реализации товара. Т.е. он уменьшает необходимое количество номенклатуры на складе. Если прочитать его простым языком, то будет примерно следующее: Такого то числа, у такой-то организации, с такого-то склада, контрагента такой-то по такому-то договору приобрел такой товар, в таком-то количестве и в такую цену. То, что Вы указали в сообщении №3 в корне не правильно. Сами то попробуйте прочитать подобную таблицу.
    upload_2015-5-3_23-23-55.png
    Даже в Вашем примере видно, что таблица не правильная. У любой таблицы есть колонки и строки. А что будет если Сидоров купит не 10 ручек, а 11. По вашей логике у Вас создастся еще одна колонка Ручка, 11 и на против фамилии Сидоров появится цена. А если Иванов купит че нить еще. Представляете сколько колонок будет. Как думаете это правильно?
    upload_2015-5-3_23-28-26.png
    В вашем примере правильная таблица будет выглядеть так. Что полностью соответствует логике любой базы данных.
    upload_2015-5-3_23-34-58.png
    Так ясно?
  11. TopicStarter Overlay
    Xon
    Offline

    Xon

    Регистрация:
    25 апр 2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Ну по обычной реализации то ясно.
    Но дело в том, что требуется реализовать еще другую реализацию.
    В моем примере: Ручка, 10; Ручка - номенклатура, 10 - цена. А вот 100, 200 и т.д. - это уже пользователем вбивается количество требуемой номенклатуры.
    Колонок больше чем вбито в регистре сведений номенклатуры (на текущую дату) не появится. В итоге получается, что на каждого контрагента будет вбиваться на требуемую номенклатуру количество (только той номенклатуры, которая требуется).
  12. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не то что-то в коде.
    Внутренний цикл должен быть не по Товары, а по ТаблицаНоменклатуры.
    И не понятно где вы получаете нужную колонку. (НомерСоответствияТекущейКолонки - в оригинальном коде.) Вам же надо в табличную часть записать данные из определенной колонки табличного поля ВизуальныеТовары. Т.е. при заполнении табличного поля у вас должны создаваться колонки "Количество1", "Количество2", "Количество3" и т.д. И при записи вы должны брать данные из этих колонок. Вот этот номер 1, 2, 3 (НомерСоответствияТекущейКолонки ) вы и должны получать, чтобы знать что записывать (в оригинальном коде СтрокаТаблицыТиповЦен["цена" + НомерСоответствияТекущейКолонки]).
    Xon нравится это.
  13. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Я, видимо, туповат для Вашей схемы.
  14. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
  15. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Саш, я понимаю это. Я логику пытаюсь понять в общем. От обычной реализации пока она далека. :)
  16. TopicStarter Overlay
    Xon
    Offline

    Xon

    Регистрация:
    25 апр 2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Исправил процедуру, но она не отрабатывает
    Код:
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
      
        Товары.Очистить();
        КоличествоСтрок = ВизуальныеТовары.Количество() - 1;
        Для Стр = 0 По КоличествоСтрок Цикл
            СтрокаТаблицыНоменклатуры = ВизуальныеТовары[Стр];
          
            Для Каждого СтрокаНоменклатуры Из ТаблицаНоменклатуры Цикл
                НомерСоответствияТекущейКолонки = мСоответствиеНоменклатуры[СтрокаНоменклатуры.Номенклатура];
              
                НоваяСтрока                             = Товары.Добавить();
                НоваяСтрока.НомерСтроки                    = Стр;
                НоваяСтрока.Номенклатура                = СтрокаТаблицыНоменклатуры["Номенклатура" + НомерСоответствияТекущейКолонки];
                НоваяСтрока.ТочкаПродаж                 = СтрокаТаблицыНоменклатуры["ТочкаПродаж" + НомерСоответствияТекущейКолонки];
                НоваяСтрока.Адрес                       = СтрокаТаблицыНоменклатуры["Адрес" + НомерСоответствияТекущейКолонки];
                НоваяСтрока.ПериодичностьЗакупа           = СтрокаТаблицыНоменклатуры["ПериодичностьЗакупа" + НомерСоответствияТекущейКолонки];
                НоваяСтрока.ДеньНеделиЗакупа              = СтрокаТаблицыНоменклатуры["ДеньНеделиЗакупа" + НомерСоответствияТекущейКолонки];
                НоваяСтрока.Контакты                      = СтрокаТаблицыНоменклатуры["Контакты" + НомерСоответствияТекущейКолонки];
            КонецЦикла;
        КонецЦикла;
      
    КонецПроцедуры
    Последнее редактирование: 4 май 2015
  17. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    каша-малаша какая-то

    то что вы описали больше смахивает на отчёт по продажам/реализации
    но какими-то странными (мягко говоря) способами

    номенклатура обычно хранится в справочнике
    продажа оформляется документом, который пишет данные в регистры (РС и РН)
    остатки и движения можно потом получить из регистра/регистров без документов

    опишите нормально исходные данные и что вы хотите в итоге
  18. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Бесполезно, я пытался :D

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