Базовый курс. Домашнее задание №10

Начинаем третий блок базового курса.

Представляем первое задание по нему.

Для выполнения рекомендуется изучить следующие главы 3-го блока.

Глава 1. Основные понятия бухгалтерского учета.
Глава 2. План счетов.
Глава 3. Регистр бухгалтерии.
Глава 4. Программная работа с регистром бухгалтерии.
Глава 5. Автоматизация аналитического учета.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 65 на “Базовый курс. Домашнее задание №10”

  1. ДЗ №10 выполнил. Трудностей не возникло, если не считать сообщение о том, что “…изменения внес другой пользователь…”, которое победил только посмотрев ваше решение.

  2. iporozhnyakov 19.01.2011 в 17:14

    Добавил документ “Операция”, создал счета, план видов характеристик и регистр бухгалтерии.
    Описал процедуру проведения документа “Операция” (с учетом сворачивания движений) и “Поступление товаров и услуг”.

  3. Выполнил в основном самостоятельно.
    Сложности при выполнении с запретом использования групп счетов в проводках. Также, удивило, что можно отказаться от записи в обработчике При записи модуля набора записей регистра бухгалтерии.

  4. Задание сделал за час. Зря на так долго откладывал )))
    Усложнил себе задачу, добавив субконто сотрудников и контрагентов на соответсвующих счетах. вышло симпатишна )

  5. Sergey.Volkov 10.01.2011 в 21:46

    Создал план счетов, в нем создал требуемые предопределенные элементы. В модуле созданного ПланаСчетов1 определил обработчик ПередЗаписью(), в котором устанавливаю стандартный реквизит счета Порядок.
    Создал план видов характеристик для учета товарно-материальных ценностей с предопределенным элемпентом Товары типа СпрпавочникСсылка.Номенклатура.
    Связал созданные ПланСчетов1 и ПланВидовХарактеристик1 присвоив свойству “Виды субконто” плана счетов значение ПланВидовХарактеристик1. Для всех предопределенных счетов установил значение субконто равное элементу из ПланВидовХарактеристик1.
    Для учета проводок по хозяйственным операциям создал РегистрБухгалтерии1 с ресурсом хранящим сумму операции. Связал регистр с ПланСчетов1 через свойство “План счетов”. Назначил регистратором документ “ПоступлениеТоваров”.
    Загружаю набор записей в РегистрБухгалтерии1 из таблицы значений, полученной запросом к документу ПоступлениеТоваров, выбирающему его тмц (товары и наборы).
    Для формирования проводки “Дт41-Кт60” при получении данных тмц документа ПоступлениеТоваров передаю в запрос корреспондирующий счет Поставщики из ПланСчетов1.
    Аналогичным образом делаю для документа АвансовыйОтчет, передавая в запрос в качестве корреспондирующего счета Сотрудники (проводка “Дт41-Кт71”).
    Создал документ Операция с возможностью прямой записи в РегистрБухгалтерии1. Период проводки беру из даты документа.
    Суммирование проводок с одинаковыми счетом и аналитикой выполняю предварительно в таблице значений (метод Свернуть), затем записываю в набор записей.
    Чтобы не использовать в проводках группы использую булевский реквизит объекта ПланСчетов1, который устанавливаю при запуске системы для групповых элементов и родителей. Запрет записи счетов выполняю в модуле набора записей РегистраБухгалтерии1, в обработчике ПриЗаписи().

  6. Задание выполнил. Особых сложностей не возникло.

  7. Задание выполнено.
    Все элементарно, комментировать особо и нечего, разве что запрет использования счета-группы реализовал по аналогии с типовой (лучшего велосипеда пожалуй не изобрести). А именно: у плана счетов “Хозрасчетный” создал реквизит булевского типа ЗапретитьИспользоватьВПроводках. Создал обработчик события “ОбработкаВыбора” для поля выбора счетов Дт и Кт и в нем такая строчка кода:
    <code>
    СтандартнаяОбработка = НЕ ВыбранноеЗначение.ЗапретитьИспользоватьВПроводках;
    </code>
    ну и сообщение пользователю.

    • >Создал обработчик события «ОбработкаВыбора» для поля выбора счетов Дт и Кт и в нем такая строчка кода
      Желательно более надежно защититься. Ведь проводки могут формироваться при проведении, также документ Операция может создаваться программно.

      • Да, согласен. Добавил также проверку в модуль набора записей РБ в процедуру ПередЗаписью().

  8. MashkaRomashkina 06.01.2011 в 14:14

    Задание выполнила.
    Для заполнения порядка использовала метод ПолучитьПорядокКода().
    При проведении документов Приходная и Авансовый отчет в модуле объекта запросом получаю таблицу значений по табличной части документа и загружаю ее в набор движений документа.
    По документу Операция:
    В процедуре Перед записью модуля набора записей определяю Период как ЭтотОбъект.Отбор.регистратор.Значение.Дата
    Дубли строк устраняю так:

    ТЗ = Движения.РегистрБухгалтерии.Выгрузить();
    ТЗ.Свернуть(“СчетДТ,СчетКт,СубконтоДт1,СубконтоКт1,ВидСубконтоДт1,ВидСубконтоКт1″,”Сумма”);
    Движения.РегистрБухгалтерии.Загрузить(ТЗ);
    ТЗ = Движения.РегистрБухгалтерии.Выгрузить(); ТЗ.Свернуть(“СчетДТ,СчетКт,СубконтоДт1,СубконтоКт1,ВидСубконтоДт1,ВидСубконтоКт1″,”Сумма”); Движения.РегистрБухгалтерии.Загрузить(ТЗ);
    Для плана счетов создаю реквизит “ЗапретитьИспользование“.
    В модуле набора записей перед записью проверяю используемые счета. Если Запретить Использование, то Отказ = Истина. Вывожу сообщение пользователю.

  9. Задание выполнено. Трудностей не возникло. Свертку для док. Операция произвожу в модуле объекта док. Операция в процедуре ПередЗаписью

  10. comradeegor 04.01.2011 в 22:07

    Задание выполнил, проблем не было. Задание небольшое и в основном основано на материалах уроков.
    Ликвидацию дублей реализовал в модуле набора записей регистра бухгалтерии. Набор записей выгружал в таблицу значений, использовал метод таблицы значений Свернуть() и результат загружал в набор записей. Список колонок группировки получил из полей, которые генерирует виртуальная таблица ДвиженияРегистраБухгалтерииССубконто. Так на вскидку сложно сказать, какие точно поля содержит таблица значений, получаемая из набора записей. С интересом посмотрю ваше решение, мне кажется, я поступил тупо и прямолинейно.

    В ПланеСчетов создал реквизит типа булево “ЗапретитьИспользоватьВпроводках”, в событии “ПередЗаписью” набора записей регистра бухгалтерии проверяю счета Дт и Кт и если этот реквизит – Истина – выставляю Отказ = Истина.

    Конечно, было бы более правильно запретить вообще выбирать эти счета в соответствующие поля ввода, но как это сделать, не сообразил.

    • >Так на вскидку сложно сказать, какие точно поля содержит таблица значени
      Можно циклом обойти колонки.

      • comradeegor 05.01.2011 в 21:25

        Точно, спасибо. Прям как-то вылетело из головы.

  11. Сделал задание. Особых затруднений не вызвало. Сделал все аналогично тому как это реализовано в материалах базового курса.  Для запрета внесения счетов-групп в проводки использую реквизит плана счетов ЗапретНаИспользованиеВПроводках, который проверяется при записи набора записей регистра бухгалтерии. В этом же модуле реализовал простановку даты  при введении операции, а так же свертку записей регистра для удаление дублей строк в документе операции.  Для свертки ЭтотОбъект выгружаю в таблицу значений , сворачиваю ее и заново загружаю обратно в набор записей.

  12. Вячеслав Вязигин 27.12.2010 в 08:57

    Задание выполнено. Затруднений не возникло.

  13. Антон К. 26.12.2010 в 18:30

    Добрый вечер,  задание выполнил.
    1) Устранение дублей делаю через выгрузку в таблицу значений, сворачиванию и загрузке.
    2) Запрет использования Счетов в проводках через реквизит ЗапретИспользования в плане счетов.

    Хотел вывести сообщение для таблицы движений в документе Операция с привязкой к конкретному полю, но не понял как это сделать. Мой код:
    Сообщение.Поле = “Движения.УУ[” + (Движение.НомерСтроки – 1) + “].СчетДт”;
    Сообщение.УстановитьДанные(ЭтотОбъект);

    УУ – имя регистра бухгалтерии

    Но сообщение всегда указывает на верхний левый угол табличного поля (вне зависимости от строки и реквизита). Я правильно понимаю, что это не возможно?
    (вообще, у меня всегда возникают сложности с привязкой сообщения к полю).

    • >Я правильно понимаю, что это не возможно?
      Ваш код написан правильно. Привязка должна быть.
      Налицо очередная “особенность” текущего релиза.
      Для примера замените “СчетДт” на “Сумма” привязка должна появиться.
      Почему не работает со счетом дебета, сейчас пытаемся разобраться. Чуть позже сообщим результат..

    • Указанное поведение является ошибкой платформы.

  14. Задание выполнил.
    1. Програмнное заполнение реквезита “ПорядокСчета”- реализовал с помощью ф-й ПолучитьПорядокКода().
    2 Открытие аналитике по номенклатуре, создал ПВХ – “ВидыСубконто” и указал в ПланеСчетов
    3 Создал РегистрБухгалтерии с ресурсом Сумма
    4 В общем модуле ДвиженияПоРегистрамСервер, прописал процедуру Проводки(ДвиженияРезультат)  Экспорт, где Результат – запрос из документа. В документах “ПоступлениеТоваров” и “АвансовыйОтчет” в ОбработкеПроведения, в существующю запрос добавил новые параметры “СчетДт” и “СчетКр” и вызываю прпоцедуру Проводки(ДвиженияРезультат).
    5 В документе   “Операция” запретил его проведение, в модуле нобора записей РегистраБухгалтерии в процедуре ПередЗаписью выгружаю НаборЗаписей в Таблицу значений.

  15. Евгений Шилов 24.12.2010 в 13:32

    Задание выполнил.
    Заполнение даты как и поиск дублей документа операция вынес в модуль набора записей.
    Добавил раквизит “ЗапретитьИспользовать” в план счетов, для учета родителей групп.
    Так же получил ошибку с “Данные были изменены или ….”. Странное поведение..
    Возникли проблемы при написание универсальной процедуры для проводок по регистру бухгалтерии. Пока перебираю строки.

  16. Здравствуйте. ДЗ №10  выполнила.

    Многое в задании было уже разобрано в уроках, поэтому трудностей не возникло.
    Из самостоятельного:
    сворачивание “дублей” в документе Операция.
    Набор записей выгружается в ТЗ, ТЗ сворачивается и загружается обратно в набор записей. Очевидно.
    проведение по регистру бухгалтерии в стиле эталонного решения дз.
    В документах Поступление товаров и Авансовый отчет в ТЧ добавлены реквизиты СчетДт и СчетКт. При создании счета подставляются по умолчанию. Далее со всеми остановками:-) – запрос к табличной части документа и загрузка результатов запроса в набор записей.

    Товары и материалы пока никак не разделены, т.к. в задании это не указано. Пока всё приходуется на 41.01.

  17. Задание Выполнил. Все пункты задания Сделал как описано в уроках Заполнение порядка, Дата для документа Операция. Сворачивание проводок сделал в модуле набора записей  в процедуре перед записью. Выгружаю набор в таблицу Значений ТЗ ,   ТЗ= Выгрузить(); потом ТЗ.Свернуть(“ВидСубконтоДт1,ВидСубконтоКт1,Период,Регистратор,СубконтоДт1,СубконтоКт1,СчетДт,СчетКт”,”Сумма”);потом Загрузить(ТЗ);
    Проверка счета на группу сделал запрос. В модуле набора записей, ПередЗаписью() Циклом перебираю все запись набора. В цикле дважды вызываю запрос первый раз для СчетаДт второй Для СчетаКт. Запрос отбирает все счета Планасчетов у которых это счет является родителем. Дальше если Не(результат.Пустой()) то отказ выполнения обработки.

  18. Manase940N 21.12.2010 в 21:46

    Задание выполнил.
    Как почти все, столкнулся с сообщением “запись была удалена или модифицирована другим пользователем”.
    Для проверки в проводках счета-группы решил создать реквизит плана счетов, заполняемый программно.
    Свертывание проводок в документе “Операция” провожу в процедуре “ПередЗаписью”, путем выгрузки движений в ТЗ и загрузки свернутой ТЗ обратно.

  19. Задание выполнено. В процедуре ПередЗаписью модуля набора записей происходит присвоение даты и свертка проводок с помощью выгрузки в таблицу значений, свертки и обратной загрузки.
    Проверку на счет-группу делаю в модуле документа Операция. С помощью запроса отбираю счета, являющиеся в плане счетов родителями для других счетов.
    Запрос.Текст =
    “ВЫБРАТЬ
    |    Управленческий.СчетДт
    |ИЗ
    |    РегистрБухгалтерии.Управленческий КАК Управленческий
    |ГДЕ
    |    Управленческий.Регистратор = &Регистратор
    |            И Управленческий.СчетДт В
    |                (ВЫБРАТЬ
    |                    Управленческий.Родитель
    |                ИЗ
    |                    ПланСчетов.Управленческий КАК Управленческий)” ;
    Не получилось решить задачу одним запросом по Д и К. Приходится выполнять аналогичный запрос по К.
     

  20. Задание выполнено.

    1. Программное заполнение реквизита “ПорядокСчета” –
    с помощью функции ПолучитьПорядокКода().

    2. Реализация проверки дублей, заполнение периода проводки
    реализована в модуле набора записей регистра бухгалтерии.
    Используется обработчик события “ПриЗаписи”.

    3. Для учета счетов, запрещенных в проводках добавлен реквизит
    плана счетов “ЗапретитьИспользоватьВПроводках”.
    Сама проверка реализована в модуле набора записей
    регистра бухгалтерии в обработчике события “ПриЗаписи”.
    Реализовано обращение с помощью запроса к регистру с отбором
    по регистратору. Запрос возвращает проводки,
    в которых используются запрещенные счета.

    При реализации док. “Операция”  тоже наткнулся на сообщение
    «Данные были изменены или удалены другим пользователем».

    Небольшой вопрос.
    Задачу сворачивания дублей, которая присутствует в этом задании,
    можно решить несколькими способами:
    1. С помощью метода “Свернуть” таб. значений.
    2. С помощью запроса: помещение таб. знач.  во временную таблицу,
    группировка по необходимым реквизитам, выгрузка результата запроса
    в итоговую таблицу значений.

    В первом случае пишется 1 строчка кода, во втором абзац.
    Является ли решение данной задачи с помощью запроса более
    производительным. На сколько я понимаю, метод “Свернуть” все-равно
    не явно строит запрос с группировкой по необходимым колонкам.

    • >Является ли решение данной задачи с помощью запроса более производительным
      Хороший вопрос.
      Есть предположение, что на небольших объемах данных метод Свернуть() будет сильно выигрывать. Поскольку накладные расходы на создание временной таблицы будут существенными.
      Вполне возможно, что на объемах десятки тысяч строк использование временной таблицы будет более производительным решением.
      Однако, для 100% уверенности нужно провести тестирование
      >На сколько я понимаю, метод «Свернуть» все-равно не явно строит запрос с группировкой
      Не совсем так. Метод Свернуть работает с объектом, находящимся в оперативной памяти (при ее нехватке – идет выгрузка на диск).
      Поэтому запроса здесь нет, работают обычные алгоритмы
      В случае временной таблицы, она создается в СУБД, далее СУБД выполняет обработку запроса.

  21. ДЗ выполнил. Пока затруднений не возникло. Все как в видеоуроках, да и бухучет мне несколько ближе чем операционный.
    Организационный вопрос – никак понять не могу порядок работы с дисками – может где-то было описание работы с ними и я просмотрел ? Защита состоит в том что без диска не будет показывать ? Или есть еще временные какие то ограничения ? Просто где то проскакивали еще какие то привязки к железу раньше в обсуждении (или это не про базовый) ? Можно ткнуть конкретно где обо всем этом написано. Если какой то тайный смысл есть можно по почте ответить. Просто не хотелось бы вдруг получить не читаемый диск. Дышать на него и то боязно. Заранее спасибо.

    • >Защита состоит в том что без диска не будет показывать
      Да, так. Временных ограничений нет.
      Привязки к железу в случае поставки CD-RX дисков нет.
      >Просто не хотелось бы вдруг получить не читаемый диск.
      Если что-то не так с дисками – пишите на саппорт. Будем решать.

  22. Платформа  8.2.12.96 на документе “Операция” вдруг начали выскакивать сообщения “Данные были изменены или удалены другим пользователем”. В комментариях нашел метод лечения, спасибо.
    Хоть задание и,относительно, легкое, но постоянно натыкался на всякие мелочи, то забыл в плане счетов поставить поддержку корреспондеции, то установить количество субконто<>0, то еще что-то, а тут еще эта ошибка платформы.
    От дублей строк избавлялся в ПередЗаписью() модуля объекта “Операция”. Набор записей выгружал в ТЗ и делал свертку, здесь же устанавливал период, из ТЗ загружал обратно в набор записей.
    В плане счетов добавил булевый реквизит на проверку использования в проводках. В “Операции” обрабатывал проверку непосредственно в форме документа при обработке выбора для СчетДТ и СчтеКт. Также сделал проверку на использование в проводках в модуле набора записей регистра бухгалтерии.

  23. Задание выполнил. Затруднений не возникло.
                    Заполнение реквизита «ПорядокСчета» реализовано в модуле объекта ПланСчетовУправленческий:
    <code>
    Процедура ПередЗаписью(Отказ)
                    Порядок = ПолучитьПорядокКода();
    КонецПроцедуры
    </code>
                    Для формирования проводок при проведении документов «Поступление товаров» и «Авансовый отчет» были внесены изменения в обработчики событий ОбработкаПроведения. Например, обработчик документа «Поступление товаров» принял следующий вид:
    <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
                    РезультатОстаткиТоваров = РаботаСДокументаСервер.ПолучитьДанныеПоТоварамДокумента(Ссылка, Дата);
                    РезультатЗакупки = РаботаСДокументаСервер.ПолучитьДанныеПоНоменклатуреДокумента(Ссылка, Дата, Контрагент);
                    ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуре(Движения, РезультатОстаткиТоваров, РезультатЗакупки);
                   
                    Запись = Движения.Взаиморасчеты.ДобавитьРасход();
                    Запись.Период = Дата;
                    Запись.Контрагент = Контрагент;
                    Запись.Сумма = СуммаДокумента;
                    Движения.Взаиморасчеты.Записывать = Истина;
                   
                    Движения.РегистрБухгалтерииУправленческий.Записывать = Истина;
                    Для каждого ТекущаяСтрока Из РезультатЗакупки.Выгрузить() Цикл
                                  
                                   Если ТекущаяСтрока.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
                                                   Продолжить;
                                   КонецЕсли;
                   
                                   Проводка = Движения.РегистрБухгалтерииУправленческий.Добавить();
                                   Проводка.Период = Дата;
                                   Проводка.СчетДт = ПланыСчетов.ПланСчетовУправленческий.Товары;
                                   Проводка.СчетКт = ПланыСчетов.ПланСчетовУправленческий.Поставщики;
                                   Проводка.СубконтоДт.Номенклатура = ТекущаяСтрока.Номенклатура;
                                   Проводка.Сумма = ТекущаяСтрока.Сумма;
                   
                    КонецЦикла;
    КонецПроцедуры
    </code>
                    Создан документ «Операция». Весь необходимый функционал реализован в обработчике объекта ПередЗаписью:
    <code>
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
                   
                    Набор = Движения.РегистрБухгалтерииУправленческий;
                    Набор.Записывать = Истина;
                   
                    ТаблицаДвижений = Набор.Выгрузить();
                    ТаблицаДвижений.ЗаполнитьЗначения(Дата, “Период”);
                    ТаблицаДвижений.Свернуть(“Период,СчетДт,СчетКт,ВидСубконтоДт1,ВидСубконтоКт1,СубконтоДт1,СубконтоКт1”,
                                                                                                                  “Сумма”);
                   
                    Набор.Загрузить(ТаблицаДвижений);
                   
    КонецПроцедуры
    </code>
                    В плане счетов добавлен реквизит ЗапретитьИспользованиеВПроводках (тип Булево). Проверка корректности использования счетов в проводках происходит в модуле набора записей регистра бухгалтерии РегистрБухгалтерииУправленческий:
    <code>
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
                   
                    Таблица = ЭтотОбъект.Выгрузить();
                    Для каждого Запись Из Таблица Цикл
                                   Если (Запись.СчетДт.ЗапретитьИспользованиеВПроводках) Тогда
                                                   Отказ = Истина;
                                                   Сообщение = Новый СообщениеПользователю;
                                                   Сообщение.Текст = “В проводке № ” + Запись.НомерСтроки + ” присутствует счет дебета ” + Запись.СчетДт +
                                                   “, запрещенный для использования в проводках”;
                                                   Сообщение.Сообщить();
                                   КонецЕсли;
                                   Если (Запись.СчетКт.ЗапретитьИспользованиеВПроводках) Тогда
                                                   Отказ = Истина;
                                                   Сообщение = Новый СообщениеПользователю;
                                                   Сообщение.Текст = “В проводке № ” + Запись.НомерСтроки + ” присутствует счет кредита ” + Запись.СчетКт +
                                                   “, запрещенный для использования в проводках”;
                                                   Сообщение.Сообщить();
                                   КонецЕсли;
                    КонецЦикла;
    КонецПроцедуры
     
    Процедура ПередЗаписью(Отказ, РежимЗаписи)
                    Отказ = НЕ ПроверитьЗаполнение();
    КонецПроцедуры</code>
     
     
     

  24. Задание выполнила, основные моменты:
    – заполнение реквизита “Порядок счета” сделала в модуле объекта плана счетов в процедуре перед записью
    Порядок = СокрЛП(ПолучитьПорядокКода());
    – при проведении документов прихода в процедуру ДвиженияПоНоменклатуре передаю счет кредита и выгрузив РезультатЗакупки в таблицу значений добавила цикл по ней для формирования проводок по регистру бухгалтерии
    – для документа Операция в модуле набора записей регистра бухгалтерии добавила: перед записью заполняю период проводки датой документа, тут же для счетов дебета и кредита вызываю функции проверки является ли счет группой
    Функция СчетЭтоГруппа(ПроверитьСчет)
    Результат = Ложь;
    выбсч=ПланыСчетов.Хозрасчетный.ВыбратьИерархически(ПроверитьСчет);
    Если выбсч.Следующий() Тогда
    Результат = Истина;
    КонецЕсли; 
    Возврат Результат;
    если нахожу группу Отказ выставляю в Истину и делаю возврат, иначе сворачиваю одинаковые проводки
    Если ЭтотОбъект.Количество() > 1 Тогда
    ТаблицаЗаписей = ЭтотОбъект.Выгрузить();
    ТаблицаЗаписей.Свернуть(“Регистратор,Активность,МоментВремени,СчетДт,СчетКт,ВидСубконтоДт1,ВидСубконтоКт1,СубконтоДт1,СубконтоКт1″,”Сумма”);
    Если ТаблицаЗаписей.Количество() <> ЭтотОбъект.Количество() Тогда
    ЭтотОбъект.Загрузить(ТаблицаЗаписей);
    КонецЕсли; 
    КонецЕсли;

  25. Д/З выполнил, затруднений не возникло.
    Для формирование порядка использовал соответствующую функцию, перед записью счета.
    ПередЗаписью операции сворачивал движения, что бы избежать дублей, а так же заполнял период.
    ПриЗаписи проверял на наличие счетов по которым запрещены проводки. Для определения счетов по которым запрещены проводки использовал булевый реквизит(как в типовых)
    Присоединяюсь к вопросу Admin_Net_1C касательно эффекта исчезновения движений, при установке пометки удаления.

    Проявление:
    – Документ является регистратором регистра БУ, но при этом его проведение ЗАПРЕЩЕНО.
    – Движения редактируются в форме через КоллекциюДвижений документа.
    – При установке пометки удаления движения исчезают ?! Почему ?! Как избежать ?

    • Скорее всего движения пропадают, поскольку вы записываете пустой набор записей (который вытесняет имеющиеся движения).
      При пометке на удаление (или ее снятии) движения в набор записей не подгружаются. Поэтому, чтобы их “достать” нужно прочитать набор записей.

      Вот такой код должен решить проблему:

      Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
         
          НаборЗаписей = Движения.РегистрНакопления1;
          Если ПометкаУдаления  Ссылка.ПометкаУдаления Тогда
              НаборЗаписей.Прочитать();
              НаборЗаписей.Записывать = Истина;
          КонецЕсли;
         
          Для каждого Проводка Из Движения.РегистрНакопления1 Цикл
              Проводка.Активность = НЕ ПометкаУдаления;
          КонецЦикла;
         
      КонецПроцедуры
  26. Задание выполнила.
    1. Создала план счетов, ввела предопределенные счета. Для программного заполнения реквизита “Порядок счета” использовала МО Плана счетов, процедура “ПередЗаписью”
    Порядок = ПолучитьПорядокКода();
    2. Для открытия аналитики по номенклатуре, создала ПВХ – “ВидыСубконто” и как виды субконто указала в ПланеСчетов.
    3. Создала РегистрБухгалтерии, с ресурсом – Сумма
    4. В общем модуле ДвиженияПоРегистрамСервер, прописала экспортную процедуру Проводки(Движения,Результат) , где Результат – результат запроса из документа. В документах  “Поступление товаров” и “Авансовый отчет” в ОбработкеПроведения , добавила в уже существующий запрос новые параметры “СчетДт” и “СчетКт” и вызываю процедуруПроводки(Движения,Результат) , для записи данных в регистр бухгалтерии.
    5. Создала документ “Операция”, запретила его проведение. В МО РегистраБухгалтерии в процедуре  ПередЗаписью выгружаю НаборЗаписей в Таблицу значений
    <code>
    ТЗ = ЭтотОбъект.Выгрузить();
    Тз.Свернуть(“СчетДт,СчетКт,видСубконтоДт1,СубконтоДт1,ВидСубконтоКт1,СубконтоКт1″,”Сумма”);
    ЭтотОбъект.Загрузить(Тз);
    </code>
    После чего перебираю записи и проставляю период, как было показано в уроках.
    6. Для реализации механизма, который не будет позволять использовать в проводках счета-группы в процедуре МО РегистраБухгалтерии в процедуре “ПриЗаписи” сделала следующие (подозреваю, что это не самый правильный вариант, но через  запрос, не очень получается пока)
    <code>
    Тз = ЭтотОбъект.Выгрузить();
    Тз2 = ЭтотОбъект.Выгрузить();

    Тз.Свернуть(“СчетДт,СчетКт”);
    Тз2.Свернуть(“СчетДт”);
    Для каждого ТзСчет Из Тз Цикл
    СтрокаТз2 = Тз2.Добавить();
    СтрокаТз2.СчетДт = ТзСчет.СчетКт;
    КонецЦикла;
    Тз2.Свернуть(“СчетДт”);
    ЕстьГруппа = 0;
    Для каждого ТзСчет Из Тз2 Цикл
    ВыборкаПоСчету = ПланыСчетов.ПланСчетов.Выбрать(ТзСчет.СчетДт);
    Родитель = Ложь;
    Если ВыборкаПоСчету.Следующий() Тогда
    Родитель = Истина;
    КонецЕсли;
    Если Родитель Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Нельзя выбирать счет ” + ТзСчет.СчетДт + ” т.к. это группа! “;
    Сообщение.Сообщить();
    ЕстьГруппа = 1;
    КонецЕсли;
    КонецЦикла;
    Если ЕстьГруппа = 1 Тогда
    Отказ = Истина;
    КонецЕсли;    
    </code>

  27. Admin_Net_1C 16.12.2010 в 07:22

    Возник один вопрос в процессе выполнения задания. В МО “Операция” в методе “ПередЗаписью” для устанения дублей выполняю следующий код:
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    ДвиженияБУ = Движения.РегистрБухгалтерииУправленческий;

    тзПроводки = ДвиженияБУ.Выгрузить();

    Для каждого Проводка Из тзПроводки Цикл
    Проводка.Период = Дата;
    Проводка.Активность = НЕ ПометкаУдаления;
    КонецЦикла;

    тзПроводки.Свернуть(“Период,Регистратор,Активность,ВидСубконтоДт1,ВидСубконтоКт1,СубконтоДт1,СубконтоКт1,СчетДт,СчетКт”,”Сумма”);
    ДвиженияБУ.Загрузить(тзПроводки);

    КонецПроцедуры
    Создаю новый документ, ввожу проводки:
    Дт 51 Кт 62 500 руб.
    Дт 71 Кт 51 200 руб.
    Дт 51 Кт 62 300 руб.
    Нажимаю кнопку Записать, все прекрасно отрабатывает, проводки записываются, строки сворачиваются в две:
    Дт 51 Кт 62 800 руб.
    Дт 71 Кт 51 200 руб.
    А вот далее самое интересное! Не закрывая документ, через выпадающее меню “Все действия” выбираю “Пометить на удаление”. В соответствии с кодом активность у проводок дожна выключиться… Не тут то было, в режиме отладке встаю на вторую строку процедуры:
    тзПроводки = ДвиженияБУ.Выгрузить();
    и выясняется что ДвиженияБУ пустой! В связи с этим вопрос, у меня одного руки кривые или в чем проблема? ))

    • Правильно я понял, что проблема связанна именно с пометкой удаления?
      Перед тем, как пройтись по набору записей циклом нужно вызывать метод ДвиженияБУ.Прочитать().

      • Admin_Net_1C 16.12.2010 в 11:06

        Если я вызываю метод ДвиженияБУ.Прочитать() то в колекции ДвиженияБУ попадают записи которые уже записаны, а не те которые на форме редактируются.
        Не знаю точно только ли с пометкой удаления связан данный эффект.

        • Этот эффект рассмотрим в решении ДЗ.

          • Admin_Net_1C 16.12.2010 в 12:09

            Домашнее задание выполено, но с учетом последней проблемы.
            Для запрета выбора счетов-групп в проводках документа “Операция” применил следующий прием в МО методе “ПередЗаписью”:
            ВыборкаПланСчетов = ПланыСчетов.Управленческий;

            НомерСтроки = 1;
            Для каждого Проводка Из тзПроводки Цикл

            //проверим нет ли счетов-групп в проводках
            РезультатВыборки = ВыборкаПланСчетов.ВыбратьИерархически(Проводка.СчетДт);
            Если РезультатВыборки.Следующий() Тогда
            Отказ = Истина;
            Сообщить(“Строка №”+ НомерСтроки +”, нельзя выбирать в качестве счета группу!”);
            КонецЕсли;

            РезультатВыборки = ВыборкаПланСчетов.ВыбратьИерархически(Проводка.СчетКт);
            Если РезультатВыборки.Следующий() Тогда
            Отказ = Истина;
            Сообщить(“Строка №”+ НомерСтроки +”, нельзя выбирать в качестве счета группу!”);
            КонецЕсли;

            Проводка.Период = Дата;
            Проводка.Активность = НЕ ПометкаУдаления;

            НомерСтроки = НомерСтроки+1;
            КонецЦикла;

             

  28. Добавление предопределенных счетов в план-счетов естественно не вызвало никаких сложностей.
    А вот при программном заполнении реквизита Порядок столкнулся с неожиданной проблемой в процедуре ПередЗаписью метод ПолучитьПорядокКода() неожиданно возвращал пустую строку и соответственно нельзя было сохранить счет. Оказалось, что подобная ситуация возникает если не заполнена маска кода. При установке маски метод стал возвращать нужное значение.
    Добавление аналитики по счетам и формирование проводок проводок при проведении документов Поступления и Авансовый отчет прошло без проблем вещи тривиальные и хорошо освещенные в уроках.
    Весь требуемый функционал документа «Операция» реализовывал в процедуре ПередЗаписью модуля документа. Удобно работать с наборам записей предварительно выгрузив его в таблицу значений, в этом случае для заполнения Периода можно воспользоваться методом ЗаполнитьЗначения, а для удаления дублей методом Свернуть таблицы значений. Вначале в методе Свернуть перечислил имена группируемых колонок через запятую, затем подумал что это не универсально и решил обратится к свойству «Колонки» ТаблицыЗначений и формировать строку имен группируемых колонок обходя элементы этой коллекции исключив колонку с именем «Сумма». Сделал не заработало. Начал разбираться оказалось, что из списка группируемых колонок также необходимо исключить колонку с именем НомерСтроки поскольку она сдержит уникальные для данного набора записей значения. Исключил заработало.
    И реализацию последнего требования задания, а именно запрет в проводках использования счетов-групп реализовал следующим образом:

    В план-счетов добавил реквизит ЗапретитьИспользованиеВПроводоках булевого типа.
    В модуле набора записей регистра бухгалтерии в процедуре ОбработкаПроверкиЗаполнения реализовал проверку если реквизит установлен то отказ с включением реквизита счета в коллекцию ПроверяемыеРеквизиты. Почему именно эта процедура, потому что в уроке 7 главы 2 «Группы и элементы. Отражение проводок по счетам плана» рекомендуется использовать именно ее.

    Оказалось, что эта процедура не срабатывает при проведении документов похоже ее нужно вызывать явно, попробовал в модуле документа Поступления после добавления соответствующих проводок вызвать Движения.РегистрБухгалтерииУпр.ПроверитьЗаполнение() процедура отработала Отказ установлен в истина и никакого эффекта не последовало все проводки спокойно записались в БД. Никаких всплывающих подсказок с предупреждениями то же нет. Это в принципе понятно для вывода подсказок нужно, чтобы набор записей размещался на форме как в документе «Операция»
    В документе «Операция» также процедура не вызывается тут вроде бы то же понятно есть нюанс об этом говорилось во 2-ом блоке в главе документы, что процедура срабатывает при проведении документа, а не при его записи, а документ Операцией не проводится, а просто записывается.
    Выходит процедура ОбработкаПроверкиЗаполнения не такое уж удачное место для размещения проверки, поэтому перенес проверку в процедуру ПередЗаписью модуля набора регистра все заработало, и при этом процедура ОбработкаПроверкиЗаполнения стала вызываться при записи документа Операция с всплывающими подсказками, вот это поведение я объяснить уже не могу.
    Осталось решить каким образом реализовать автоматическое заполнение реквизита ЗапретитьИспользованиеВПроводоках. Но перед этим, необходимо определиться какой счет будет пониматься под счетом-группой. Логично предположить. Что под этим будут пониматься те счета, на которые ссылаются другие счета через стандартный реквизит Родитель.
    Поиск таких счетов и заполнение реквизита я сделал в модуле управляемого приложения в обработке ПередНачаломРаботыСистемы. В ней вызывается процедура серверного модуля в которой запросом получаются те счета, на которые ссылаются другие счета и у которых реквизит ЗапретитьИспользованиеВПроводоках равен Ложь.

    • > процедура отработала Отказ установлен в истина и никакого эффекта не последовало все проводки спокойно записались в БД
      Нужно вызов оформить следующим образом:
      Отказ = Движения.РегистрБухгалтерииУпр.ПроверитьЗаполнение();
      Метод ПроверитьЗаполнение() возвращает результат Отказ проверки заполнения.

      ОбработкаПроверкиЗаполнения набора записей вообще вещь особенная. Она вызывается только из формы набора записей регистра (мы ее не проходили в базовом, рассматриваем в продвинутом).
      Во всех остальных случаях нужно к ней обращаться программно.

      Поэтому чтобы проверка работала железно нужно размещать ее в обработчике ПередЗаписью().

      >и при этом процедура ОбработкаПроверкиЗаполнения стала вызываться при записи документа Операция с всплывающими подсказками
      Такого не должно происходить. Поставьте точку останова в это событие и проверьте, что оно действительно вызывается.

      • >Такого не должно происходить. Поставьте точку останова в это событие и проверьте, что оно действительно вызывается.
        Да действительно это отрабатывала процедура ПриЗаписи в которой выводились сообщения с привязкой к элементам формы (СообщениеПользователю()), процедура ОбработкаПроверкиЗаполнения не отрабатывала.

  29. Задание выполнил.

    ПланСчетов, РегистрБухгатерии, ПВХ ВидыСубконто создал как в видеоуроках. 
    Программное заполнение реквизита ПорядокСчета в модуле объекта ПланаСчетов ПередЗаписью производится через Порядок = ПолучитьПорядокКода();

    Добавил в обработчики ПриПроведении документов ПоступлениеТоваров и АвансовыйОтчет вызов общей процедуры
    ДвиженияПоРегиструБухгалтерии(Движения,Товары,Кт). Кт – ПланСчетовСсылка в зависимости от вызывающего документа.

    Для исключения дублирования проводок в документе Операция в модуле объекта ПередЗаписью делается свертка:
    ТбЗн = движения.РегистрУправленческий.Выгрузить();
    Для каждого Колонка Из ТбЗн.Колонки Цикл
    Если (Колонка.Имя<>”Сумма”) И (Колонка.Имя<>”НомерСтроки”) Тогда
    Колонки = Колонки +Колонка.Имя+”,”;
    КонецЕсли;
    КонецЦикла;
    ТбЗн.Свернуть(Колонки,”Сумма”);
    Движения.РегистрУправленческий.Загрузить(ТбЗн);

    Для запрета записи проводок  по счетам-группам в модуле Набора записей регистра  ПриЗаписи делается объединенный запрос по СчетДт и СчетКт из виртуальной таблицы. Для СчетДт запрос выглядит следующим образом:
    “ВЫБРАТЬ РегистрУправленческийДвиженияССубконто.СчетДт КАК Счет ИЗ РегистрБухгалтерии.РегистрУправленческий.ДвиженияССубконто(,,СчетДт В (ВЫБРАТЬ Управленческий.Родитель
    ИЗ ПланСчетов.Управленческий КАК Управленческий), ,) КАК РегистрУправленческийДвиженияССубконто
    ГДЕ РегистрУправленческийДвиженияССубконто.Регистратор = &Регистратор СГРУППИРОВАТЬ ПО РегистрУправленческийДвиженияССубконто.СчетДт”.
    Соответственно, Отказ = Выборка.Количество().

  30. Возникла проблема при создании документа “Операция”. Не могу понять, что сделаю не так. Когда заполняю новую операцию в пользовательском режиме, то при нажатии на кнопку “Записать и закрыть” , операция записывается, но НЕ закрывается и признак Нового документе (*) не исчезает. При этом проводки в регистр бухгалтерии попадают, но когда снова открываю уже ранее созданную операцию, то в табличной части  только 1 строка и нет суммы, хотя в регистре бухгалтерии все правильно, и суммы есть и строки все. При попытки повторной записи пишет “Данные были изменены или удалены другим пользователем” .  Релиз 8.2.11.235.

    • А в форме документа или в модуле объекта реализован какой-либо код?
      Ситуация воспроизводится если сделать тоже самой на “Операции” без программного кода?

      • В том то и дело, что никакого кода еще не писалось. Все сделала, как в 4 главе, уроке 12. И вот обнаружила такую проблемку. Кстати,  если принудительно закрыть операцию, то она не появляется в списке, только через  F5!

        • Попробуйте сделать следующее.
          Сделайте в плане видов характеристик тип значения характеристики составным:
          1. Поставьте флажок “составной тип”
          2. Отметьте в списке хотя бы два типа данных (какие-нибудь справочники).

  31. Задание выполнено.
    Создал ПВХ ВидыСубконто, настроил доступные типы значений, добавил предопределенное субконто Номенклатура.
    Создал план счетов, установил маску кода, установил автопорядок по коду, добавил реквизит ЗапретитьИспользоватьВПроводках, указал ссылку на ПВХ ВидыСубконто и их максимальное количество.
    В модуле объекта плана счетов в процедуре ПередЗаписью() программным способом заполнил реквизит “Порядок” используя ПолучитьПорядокКода(). В этой же процедуре заполняю реквизит “ЗапретитьИспользоватьВПроводках”. Для этого вызываю процедуру из общего серверного модуля, где определяю, является ли счет родителем для других счетов. В зависимости от результата запроса реквизиту присваиваю истину или ложь.
    Создал счета, на счетах ТМЦ добавил аналитику по номенклатуре.
    Создал регистр бухгалтерии. Указал план счетов, отметил флажок “Корреспонденция”, добавил ресурс Сумма, назначил регистраторы. В модуль набора записей в процедуру ПриЗаписи() добавил проверку, есть ли среди проводок хоть один групповой счет (реквизит  ЗапретитьИспользоватьВПроводках = истина). Сделал через цикл “Для Каждого Проводка Из ЭтотОбъект Цикл”.
    В обработчиках проведения документов “Поступление товаров” и “Авансовый отчет” добавил формирование движений по регистру бухгалтерии. Кстати, в задании ничего не сказано о проверке, является ли товар услугой. Не стал умничать, услуги учитывал на счетах ТМЦ :)
    Создал документ Операция, поместил на форму таблицу с данными Движения.Хозрасчетный. Из списка полей убрал период и сделал его программное заполнение в модуле документа в процедуре ПередЗаписью().
    Сворачивание дублей реализовал в обработке проведения (хотя тут раздумывал, где лучше – может в ПриЗаписи?). Сперва запросом выбираю все движения по ВТ ДвиженияССубконто и группирую их. Затем движения документа очищаю и записываю. И, наконец, в выборке помещаю в движения результат запроса.
    Надеюсь все сделал правильно.

    Немного оффтопика: диск с 3-м блоком почему то не читается на работе. А дома все ок. Это так задумано или дело в CD приводе на работе? Честно говоря огорчился. :(

    • >Не стал умничать, услуги учитывал на счетах ТМЦ :)
      Если не сказано, то решение на ваше усмотрение :)
      >хотя тут раздумывал, где лучше – может в ПриЗаписи?
      Сворачивание лучше организовать до записи, то есть в обработчике ПередЗаписью().
      >Это так задумано или дело в CD приводе на работе?
      Такая проблема иногда наблюдается. Точных причин пока установить не можем.
      Видимо есть зависимость от привода.

      • >>Сворачивание лучше организовать до записи, то есть в обработчике ПередЗаписью().
        Понятно, переделаю.

  32. Ну в общем сделал.  Почти всё как по видеоурокам…
    кода почти нет, ну разве что в в модуле док. “Операции”

    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)    
    тт=Движения.РегистрБух.Выгрузить();
    тт.Свернуть(“ВидСубконтоДт1,ВидСубконтоКт1,Регистратор,СубконтоДт1,СубконтоКт1,СчетДт,СчетКт”,”Сумма”);
    Движения.РегистрБух.Загрузить(тт);
    КонецПроцедуры

    наверное проще не сделать, ну разве может быть групировка по регистратору лишняя, ведь код выполняется только в его контексте.
     
    И в модуле регистра в процедуре “ПередЗаписью”:
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ПланБух.Родитель КАК Родитель
    |ИЗ
    |    ПланСчетов.ПланБух КАК ПланБух
    |ИТОГИ ПО
    |    Родитель”;

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Вставить обработку выборки ВыборкаДетальныеЗаписи
    Тт=ВыборкаДетальныеЗаписи.Родитель;
    Для Каждого Проводка Из ЭтотОбъект Цикл
    Если ((тт=Проводка.СчетДт) Или (тт=Проводка.СчетКт)) Тогда
    Сообщить(“Неьзя делать проводки для счёта “+тт);
    Отказ=Истина;
    Возврат;
    КонецЕсли;    
    КонецЦикла;
    КонецЦикла;
     
    Здесь ничего лучше чем вложеный цикл не получилось, возможно-ли как-то красивее решить задачу?

    • >ну разве может быть групировка по регистратору лишняя
      Точно он него можно избавиться.
      > возможно-ли как-то красивее решить задачу
      Да, можно. Если использовать событие ПриЗаписи, то там движения уже записаны в БД. И можно все проверку выполнить одним запросом. При этом запрос будет возвращать только ошибочные данные.

      • >Если использовать событие ПриЗаписи
        Действительно, всего-лишь правильно выбрапть процедуру и избавляешься от вложеного цикла…
        Спасибо, учту!

  33. Сергей Войстрик 14.12.2010 в 13:24

    Материалы смотрю с ноута, привод – подключаемый внешний. Разово смотреть – не вопрос, но постоянно привод подключать и с собой носить – некомфортно. Читал – есть привязка к железу?

    • На текущий момент нет возможности сгенерировать привязку к железу.
      Если проблема позже будет актуальна, то рассмотрим варианты ее решения..

      • Сергей Войстрик 14.12.2010 в 18:54

        Надеюсь, что позже я уже буду гуру и эти уроки будут на почетной полочке :) Но все равно спасибо.

  34. Талицкий Артем 14.12.2010 в 07:03

    Извините, а 3 блок будет в доступе для скачивания?

    • Нет.
      Если есть проблемы с просмотром материалов с дисков, обращайтесь на саппорт. Решим их.

  35. Вячеслав Вязигин 13.12.2010 в 15:29

    Задание тяжеловато читается)))
    >Дт Банк Кт Покупатели 500
    >Дт Сотрудники Кт Банк 400
    >Дт Банк Кт Покупатели 300 
    не проще:
    51 62 500
    70 51 400
    51 62 300
    ?

  36. Вячеслав Вязигин 13.12.2010 в 15:25

    хм… видео запаковано в exe и смотеть чем-либо кроме его встроенной оболочки не получается. Есть ли какой-нибудь способ смотреть его на скорости 1.5х ???

    • Нет, это защищенный плеер со своим кодом…