8.х Помогите решить задачу!

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

  1. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    чето какая-то задача запутанная... если у вас флаг может изменяться только при определенном статусе документа, то почему вы это не используете? при записи делайте проверку в этом плане. если статус такой-то, то меняем флаг, если другой, то не трогаем

    т.е. вы при записи каждого документа меняете данные справочника?
  2. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    да, именно так (при записи каждого нового документа ставиться значение флага справочника). но с определёнными условиями.

    как мне всётаки добиться записи в справочник тех абонентов которые есть ТЧ документа???

    #20St88 не работает...!(
  3. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
    Для Каждого СтрокаВедомость Из Ведомость Цикл
    АбонентВыб = СтрокаВедомость.Абонент.ПолучитьОбъект();
    АбонентВыб.Флаг = Флаг;
    АбонентВыб.Записать();
    
    КонецЦикла;
    перед записью надо получить элемент справочника как обект

    Если я правильно поняла и СтрокаВедомость.Абонент - это ссылка на элемент справочника
  4. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    Спасибо огромное, немного видоизменил ваш код и воуля - работает!)

    Вот собственно чего надо было добиться и как оно работает:

    Процедура ПриОткрытии()

    МенятьФлаг = ложь;

    Если состояниеДокумента = "Открыт" тогда
    Флажок1 = ЛОЖЬ
    иначеесли состояниеДокумента = "Архив" тогда
    флажок1 = ИСТИНА
    иначеесли состояниеДокумента = "" тогда
    состояниеДокумента=перечисления.СостояниеДокВедомость.Открыт;
    флажок1 = ЛОЖЬ
    конецесли;
    //// проверка на флажок занятости

    Если состояниеДокумента = "Открыт" тогда
    МенятьФлаг = истина
    Иначеесли состояниеДокумента = "Архив" тогда
    МенятьФлаг = Ложь ;

    конецесли;



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

    Процедура ПриЗаписи(Отказ)
    Если состояниеДокумента = "Открыт" и менятьФлаг = истина тогда

    ////меняем
    Для Каждого СтрокаВедомость Из Ведомость Цикл
    АбонентВыб = СтрокаВедомость.Абонент.ПолучитьОбъект();
    АбонентВыб.ФлагЗанятости = ИСТИНА;
    АбонентВыб.Записать();

    КонецЦикла;




    конецесли;
    Если состояниеДокумента = "Архив" и менятьФлаг = истина тогда

    Для Каждого СтрокаВедомость Из Ведомость Цикл
    АбонентВыб = СтрокаВедомость.Абонент.ПолучитьОбъект();
    АбонентВыб.ФлагЗанятости = ЛОЖЬ;
    АбонентВыб.Записать();

    КонецЦикла;

    конецесли;

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

    но щас нашёл другой косяк, если ТЧ в документе очистить и записать документ, то ппц, абоненты которые там были и имеют флаг занято так и будут занятыми и никак не снимут с себя флаг и не попадут больше в ТЧ документа!((( как решить эту проблему? после записи запретить редактирование ТЧ? - не вариант, т.к. там есть колонки которые надо будет потом редактировать....(
  5. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    у строки есть обработчики события ПриУдалении и После удаления. Если очищаете построчно, то можно ими воспользоваться
  6. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    решил проблему другим путём, но всё равно спасибо!!!

    Код:
    Процедура ПриОткрытии()
    
    МенятьФлаг = ложь;
    
    Если состояниеДокумента = "Открыт" тогда
    Флажок1 = ЛОЖЬ;
    иначеесли состояниеДокумента = "Архив" тогда
    флажок1 = ИСТИНА ;
    ЭлементыФормы.Ведомость.ТолькоПросмотр=Истина;
    ЭлементыФормы.Панель1.Доступность=Ложь;
    ЭлементыФормы.Кнопка8.Доступность=Ложь;
    ЭлементыФормы.Номер=ложь;
    ЭлементыФормы.Дата=ложь;
    ЭлементыФормы.Подразделение=ложь;
    ЭлементыФормы.Флажок1=ложь;
    иначеесли состояниеДокумента = "" тогда
    состояниеДокумента=перечисления.СостояниеДокВедомость.Открыт;
    флажок1 = ЛОЖЬ
    конецесли;
    //// проверка на флажок занятости
    
    Если состояниеДокумента = "Открыт" тогда
    МенятьФлаг = истина
    Иначеесли состояниеДокумента = "Архив" тогда
    МенятьФлаг = Ложь ;
    
    конецесли;
    
    Если НЕ ЭтоНовый() Тогда
    ЭлементыФормы.Ведомость.Колонки.Абонент.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.Договор.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.Адрес.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.НаселенныйПункт.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.ПГ2.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.ПГ3.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.ПГ4.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.АОГВ.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.ВПГ.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.ОП.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.СГБ.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.Прочее.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.Всего.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.НачислСумма.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.Колонки.Датадоговора.ИзменятьПозицию = ложь;
    ЭлементыФормы.Ведомость.ИзменятьСоставСтрок = Ложь;
    конецесли;
    
    КонецПроцедуры
    
    
  7. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    Здравствуйте. Это вариант приняли, НО попросили по возможности переделать и подогнать под "общий принцип конфигураци".
    Вот что рекомендовали: Решение с использованием флага занятости абонента, не верное... для таких случаев гораздо лучше подойдет регистр сведений. Документ должен делать по нему проводки. При отмене проведения движения удаляются... тем самым отпадает необходимость в постоянных изменениях флага занятости у абонента. То, есть что сейчас сделано не в соответствии с общепринятыми принципами...

    с чего начать? как это организовать? помогите пожалуйста
  8. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    да использование регистра сведений, думаю, существенно облегчит вам жизнь. Для начала вам надо определиться со структурой этого регистра (скорее всего он будет подчинен регистратору - вашему документу). Далее надо добавить в обработчик проведения ващего дока формирование движений по этому регистру...

    Что конкретно у вас не получается при использовании регистра?
  9. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    Опыта работы с регистрами сведений не было, сейчас буду разбираться.
    Начинаю с создания нового регистра, тип ставлю переодический, создаю измерение Абонет и ресур Флаг (тип булево) так? а где задать регистратор?

    спасибо за оперативную помощь)
  10. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а он у вас периодический?

    там где вы указали что регистр у вас периодический, есть чуть ниже поле (поставить подчинен регистратору)
  11. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Режим записи называется.
  12. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    +1, просто сейчас 1с закрыта...
  13. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    ну там выбрал подчинён регистратору, а сам регистратор где выбрать?) и переодичность лучше ставить - секунды? (два пользователя заполняют одновременно ведомости, выбрали одних и тех же абонентов, кто на секунду раньше записал свою ведомость, того и абоненты, правильно?)..)
  14. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    В свойствах регистра на закладке Регистраторы.
  15. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    в соответствующем доке на закладке движения выберите ваш регистр - поставьте галочку
  16. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    Итак:
    Создал РегистрСведений. Там сделал Измерения - Абонент (тип справочник.ссылка.абоненты) и Ресурсы - ФлагЗанятости(тип булево). указал переодический ( один день).
    В документе указал что движения идут по этому регистру и написал в модуле дока пока это:

    Код:
    Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    // регистр ФлагАбонентов
    Если состояниеДокумента = "Открыт" и менятьФлаг = истина Тогда
    Для Каждого ТекСтрокаВедомость Из Ведомость Цикл
    Движение = Движения.ФлагАбонентов.Добавить();
    Движение.Период = Дата;
    Движение.Абонент = ТекСтрокаВедомость.Абонент;
    Движение.ФлагЗанятости = ИСТИНА;
    КонецЦикла;
    КонецЕсли;
    //////////////////
    Если состояниеДокумента = "Архив" и менятьФлаг = истина Тогда
    Для Каждого ТекСтрокаВедомость Из Ведомость Цикл
    Движение = Движения.ФлагАбонентов.Добавить();
    Движение.Период = Дата;
    Движение.Абонент = ТекСтрокаВедомость.Абонент;
    Движение.ФлагЗанятости = ЛОЖЬ;
    КонецЦикла;
    КонецЕсли;
    
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    КонецПроцедуры
    в правильном направлении иду?)
  17. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    нее так не работает, исправил на это:

    Код:
    [Если состояниеДокумента = "Открыт" и менятьФлаг = истина Тогда
    Для Каждого СтрокаВедомость Из Ведомость Цикл
    АбонентВыб = СтрокаВедомость.Абонент.ПолучитьОбъект();
    Движение = Движения.ФлагАбонентов.Добавить();
    Движение.Период = Дата;
    Движение.Абонент = АбонентВыб;
    Движение.ФлагЗанятости = ИСТИНА;
    КонецЦикла;
    КонецЕсли;
    //////////////////
    Если состояниеДокумента = "Архив" и менятьФлаг = истина Тогда
    Для Каждого СтрокаВедомость Из Ведомость Цикл
    АбонентВыб = СтрокаВедомость.Абонент.ПолучитьОбъект();
    Движение = Движения.ФлагАбонентов.Добавить();
    Движение.Период = Дата;
    Движение.Абонент = АбонентВыб;
    Движение.ФлагЗанятости = ЛОЖЬ;
    КонецЦикла;
    КонецЕсли;
    
    Ругается, мол типа уже есть записи от 13.11.2012г, хотя смотрю отчётом по регистру своему, записий нету. но до этого с первым вариантом движений, каждой строки было штук по 20...)))
  18. TopicStarter Overlay
    st88
    Offline

    st88 Профессионал в 1С Команда форума

    Регистрация:
    18 окт 2012
    Сообщения:
    1.726
    Симпатии:
    28
    Баллы:
    54
    Вот так работает и пишит и при отмене проведения всё удаляет из регистра, НО почему количество записей в регистр ОДНОГО абонента, равно колличеству строк в таблице???

    т.е. если 20 строк в таблице, то в регистре, 20-ть ПЕТРОВЫх, 20-ть ИВАНОВЫХ и т.д.
    где ошибка?(

    Код:
    
    Если состояниеДокумента = "Открыт" и менятьФлаг = истина Тогда
    Для Каждого СтрокаВедомость Из Ведомость Цикл
    Движение = Движения.ФлагАбонентов.Добавить();
    Движение.Период = Дата;
    Движение.Абонент = СтрокаВедомость.Абонент;
    Движение.ФлагЗанятости = ИСТИНА;
    КонецЦикла;
    КонецЕсли;
    //////////////////
    Если состояниеДокумента = "Архив" и менятьФлаг = истина Тогда
    Для Каждого СтрокаВедомость Из Ведомость Цикл
    Движение = Движения.ФлагАбонентов.Добавить();
    Движение.Период = Дата;
    Движение.Абонент = СтрокаВедомость.Абонент;
    Движение.ФлагЗанятости = ЛОЖЬ;
    КонецЦикла;
    КонецЕсли;
  19. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    пройдитесь отладчиком, посмотрите
  20. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    а в табличной части Ведомость сколько записей по "Иванову" ? 20 ... ? тогда все правильно :)

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