Базовый курс. Финальное задание 36-го потока
Объявляем начало финала 36-го потока базового курса по программированию.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись — напишите нам на e-mail поддержки.
Берина Натела Павловна, Ростов-на-Дону.
Вопросы по курсу
С 1С работаю очень давно, начинала еще с семерки, 8.0 изучала на дистанционных курсах, далее все обучение проходила самостоятельно по книгам. Понятно, что тонкостей работы в книгах нигде нет и поэтому Ваш курс очень ценен тем, что дает тонкости программирования, которых нигде не найдешь. Хоть работаю давно, но нового и интересного узнала очень много.
На работе работаю с 1С Бухгалтерией. Полученные знания применяю на практике, разобралась с управляемым приложением. Много интересного узнала об администрировании, рекурсивных процессах.
Должна сказать, что формат курса наиболее удобен из всех, на которых я училась ранее. Все-таки иные дистанционные курсы дают знания по определенному направлению –или бухгалтерские, или расчетные задачи, или оперативный учет. Ваши курсы единственные, которые дают цельное знание последовательно и углубленно. Жаль, что они сняты сейчас с продажи.
1. Документ «Покупка товаров».
Количество в табчасти – строка, а надо число 15,3.
2. Документ «Покупка товаров», форма, процедура «ЗаполнитьКлиента» :
Оператор «Объект.Клиент = Справочники.Клиенты.ОсновнойПокупатель». Предопределенного элемента в справочник «Клиенты» такого нет – есть ОсновнойПокупатель. Надо, может быть, создать основного поставщика в предопределенных справочника Клиенты.
3. Документ «Покупка товаров», форма, процедура «ЗаполнитьКлиента» :
Оператор «Объект.Клиент = Справочники.Клиенты.ОсновнойПоставщик». Так тоже не пройдет, потому что здесь надо писать в правой части равенства ПредопределенноеЗначение(“Справочник.Клиенты.ОсновнойПоставщик”).
4. Документ «Покупка товаров», форма, процедура «ЗаполнитьТовары» :
Оператор «ВвестиЗначение(Основание, “Выберите документ-основание”, Тип(“Документ.ПокупкаТоваров”));»
Тип(“Документ.ПокупкаТоваров”) использовать нельзя. Тип третьего параметра – ОписаниеТипов. Найти его надо в серверной функции
Функция ПолучениеОписанияТиповНаСервере()
Возврат Новый ОписаниеТипов("ДокументСсылка.ПокупкаТоваров");
КонецФункции
5. Документ «Покупка товаров», форма, процедура «ЗаполнитьТовары» :
Оператор «Если НЕ Основание.Пустая() Тогда» ошибочен, поскольку при отсутствии выбора Основание=Неопределено.
6. Справочник «Серии»
Выяснилось, что серии можно заносить какие угодно, поэтому нужен контроль уникальности кода
7. Документ «Покупка товаров», модуль, процедура «ОбработкаПроведения» :
Нет оператора : «Движения.ТоварыНаСкладе.Записывать=Истина;», поэтому записи не происходило в регистр.
8. Документ «Покупка товаров», форма, процедура «ЗаполнитьТовары» :
Оператор : «ЗаполнитьТоварыНаСервере(Объект.Ссылка, Основание);» неверен, т.к. у нового документа ссылки быть не может(он не записан)
И, получается, вызываема процедура полностью неверна
Объект = ТекущийДокумент.ПолучитьОбъект();
Объект.Товары.Загрузить(ДокументОснование.Товары);
КонецПроцедуры
Я переписала ее так
Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
Для каждого Строка Из ДокументОснование.Товары Цикл
НовСтрока=Объект.Товары.Добавить();
НовСтрока.Товар=Строка.Товар;
НовСтрока.Серия=Строка.Серия;
НовСтрока.Количество=Строка.Количество;
НовСтрока.Сумма=Строка.Сумма;
КонецЦикла;
КонецПроцедуры // ЗаполнитьТоварыНаСервере()
9. Документ «Продажа товаров».
На закладке «Движения» не указано, что используется регистр накопления «ЗаполнитьТовары» :
10. Документ «Продажа товаров».
Для серии в табличной части не указан владелец – товар.
11. Общий модуль «ПроверкаДокументовСервер»
У модуля проставить птичку «Вызов Сервера».
12. Общий модуль «ПроверкаДокументовСервер»
Предупреждение не допустимо на сервере, лучше заменить его на «СообщениеПользователю».
13. Документ «Продажа товаров». Форма.
Проверка документа излишняя, потому что указано для количества в табчасти, но оно неотрицательное.
14. Документ «Продажа товаров». Процедура «Обработка проведения»
Оператор «Если Недостача>0 Тогда» неверный. Должен быть знак «меньше»
15. Документ «Продажа товаров». Процедура «Обработка проведения»
В запросе
А.) не указано, что рассматривается только текущий документ,
Б.) внутреннее соединение некорректно, заменим на левое.
В.) В ТЗ указано «При этом при списании, себестоимость должна
определяться по средней в рамках серии товара», поэтому отбор должен быть и по товару и по серии,
г.) остатков на складе для выбранного товара может не быть, поэтому такой вариант тоже надо учитывать, зануляя количество и сумму NULL.
16. Документ «Продажа товаров». Процедура «Обработка проведения»
В этом условном операторе надо прервать цикл, в котором он находится, и поместить в Отказ истину
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
Сообщение.Поле = "Товары.Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Прервать;
Отказ=Истина;
КонецЕсли;
17. Документ «Продажа товаров». Процедура «Обработка проведения»
Надо обрабатывать деление на 0 в строке
«Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;»
Дополнения. Сделать «Код» в справочнике «Серии» обязательным для заполнения. На стр. «Данные» объекта нажпть на кн. «Стандартные реквизиты» найти код и для проверки заполнения проставить «Выдавать ошибку»
Ваш отчет принят. Ознакомьтесь с решением преподавателя для самоконтроля.
Фотографии отправлены на почту mg@spec8.ru 18.05.15
Андрей, благодарим Вас за обратную связь по курсу!
Финальное задание принято, поздравляем с успешным окончанием базового курса!
Добрый день!
I) Вопросы по курсу
Горбоносов Виктор Александрович,
Омск,
Тружусь в должности “Разработчик 1С” в ООО “ФТО-Проект”
1. С 1С не вчера познакомился, поэтому уже накоплен некий опыт, но хотелось привести знания в порядок, достаточно сильно проседала расчетная часть и тонкости автоматизации бухгалтерского учёта. Основы конечно знаю, как и некоторые сложные моменты, но есть белые и очень белые пятна, поэтому и приобрёл курс. Таким образом, “новым” было очень много и 4-го блока и достаточно и 3-го. О кое-чём даже не задумывался(нечасто приходится с нуля создавать план счетов или план видов расчета, поэтому интересно было узнать про их свойства.)
2. От мнения, что периодические расчёты – это сложно. Собственно главная цель приобретения курса – разобраться в азах расчетов, достигнута.
3. На практике работаю с прилично модифицированной УПП, так что некоторая часть текущего курса – это знания на перспективу. Но всё-таки на что-то взглянул через призму новых знаний – показалось проще. По сути в курсе даются не только знания, но и приёмы работы, которые оказались достаточно полезными. Например, начал пользоваться “горячими” клавишами – реально экономит время, и т.д.
4. Формат, по крайней мере для меня, идеальный: начинал с 35 потоком, а заканчиваю в последнюю ночь 36-го потока… Нельзя отрываться от производства так сказать.
II) Практическое задание:
Справочник “Серии”
Свойства:
Установить свойство “Проверка заполнения” в значение выдавать ошибку – просьба главбуха. Убрать контроль уникальности или поставить в “Пределах подчинения владельцу”, обычно такое нужно узнавать и заказчиков. Так же возможно стоит запретить незаполненность реквизита “Срок годности”
Документ “ПокупкаТоваров”
Свойства:
Тип значения реквизита табличной части “Количество” меняем со строки на Число(15,3)
Форма докумнта:
Модуль формы:
1. В процедуре “ЗаполнитьКлиента” идет обращение к несуществующему предоперделенному значению Справочники.Клиенты.ОсновнойПокупатель
Создать предопеределенный элемент и заполнять в серверном внеконтекстном вызове:
Процедура ЗаполнитьКлиента(Команда)
//++ VIGO 17.05.2015 1.
//Объект.Клиент = Справочники.Клиенты.ОсновнойПокупатель;
ЗаполнитьКлиентаНаСервере(Объект.Клиент)
//-- VIGO 17.05.2015
КонецПроцедуры
//++ VIGO 17.05.2015 1
&НаСервереБезКонтекста
Процедура ЗаполнитьКлиентаНаСервере(Клиент)
Клиент = Справочники.Клиенты.ОсновнойПокупатель;
КонецПроцедуры // ЗаполнитьКлиентаНаСервере()
//-- VIGO 17.05.2015
2. Некорректное конструирование типа Тип(“Документ.ПокупкаТоваров”)
//ВвестиЗначение(Основание, "Выберите документ-основание", Тип("Документ.ПокупкаТоваров"));
ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
//-- VIGO 17.05.2015
//++ VIGO 17.05.2015 3
3. Некорректная проверка на заполненность
//Если НЕ Основание.Пустая() Тогда
Если ЗначениеЗаполнено(Основание) Тогда
//-- VIGO 17.05.2015
4. Некорректное заполнение товаров, в качестве решения можно предложить контекстный серверный вызов:
&НаСервере
Процедура ЗаполнитьТоварыНаСервереСКонтекстом(Основание)
Объект.Товары.Загрузить(Основание.Товары.Выгрузить());
КонецПроцедуры // ЗаполнитьТоварыНаСервереСКонтекстом()
//-- VIGO 17.05.2015
Модуль объекта:
Не записываются движения документа. При текущей настройке “Записывать выбранные” нужно отметить необходимые наборы записей:
Движения.ТоварыНаСкладе.Записывать = Истина;
//-- VIGO 18.05.2015
Документ “ПродажаТоваров”
Свойства:
Документ не является регистратором по требуемому регистру, нужно установить галочку.
Форма:
Для реквизита табличной части “Серия” нужно указать параметры выбора: Отбор.Владелец(Товары.Товар)
Модуль формы:
Вообще весь функционал с проверкой документа – одна сплошная ошибка.
1. Для начала форма вообще не откроется, так как на этапе компиляции будет выходить ошибка о недоступности общего модуля. Он компилируется на сервере, а вызывается из формы.
В качестве решения можно предложить поставить галочку “Вызов сервера” в свойствах общего модуля.
2. В серверной процедуре используется механизм “Предупреждение”, который недоступен на сервере, так как связан с интерфейсом. Плюс этот механизм используется в цикле с задержкой в 5 секунд. То есть пользователю будет нужно либо нажать на кнопку столько раз, сколько ошибочных строк, либо ждать столько же раз * 5 секунд, а информационных сообщений не останется на экране.
В качестве решения можно предложить механизм сообщений, который доступен на сервере, либо возвращать с сервера номера проблемных строк и привязывать сообщения к конкретным строкам.
3. Для нового документа этот механизм вообще не отработает, так как в запросе в качестве параметра фигурирует ссылка, а у нового документа ссылка еще не существует. В качестве решения можно либо требовать записи документа, либо вызывать проверку при записи, либо проверять только существующие документы – это уже должен решать заказчик.
4. Всё бы ничего, но проверка бессмысленна ещё и потому, что проверяет невозможное: проверка идёт на отрицательные значения в реквизите табличной части “Количество”, но у данного реквизита в свойствах указано неотрицательное значение, что уже на этапе редактирования не позволяет ввести отрицательное значение.
В качестве решения можно вообще отказаться от проверки, либо убрать галочку.
Модуль документа:
В запросе так же несколько проблем:
1. Используется внутренне соединение табличной части документа и остатков, нужно поменять на ЛЕВОЕ СОЕДИНЕНИЕ
2. Табличная часть несгруппирована – сгруппировать через вложенный запрос или временную таблицу.
3. Остатки необходимо проверять на момент времени документа.
4. Остатки необходимо проверять не только по товару, но и по серии, а точнее по связке (Товар, Серия)
5. Я бы все вычисления проводил в самом запросе, плюс дополнил бы результат таким образом, чтобы можно было воспользоваться методом “Загрузить” набора записей, например что-то вроде:
"ВЫБРАТЬ
| ПродажаТоваровТовары.Товар,
| ПродажаТоваровТовары.Серия,
| СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
| СУММА(ПродажаТоваровТовары.Сумма) КАК Сумма,
| МИНИМУМ(ПродажаТоваровТовары.НомерСтроки) КАК НомерСтроки
|ПОМЕСТИТЬ ВТ_ТабличнаяЧасть
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоваровТовары.Товар,
| ПродажаТоваровТовары.Серия
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| &Дата,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| ВТ_ТабличнаяЧасть.Товар,
| ВТ_ТабличнаяЧасть.Серия,
| ВТ_ТабличнаяЧасть.Количество,
| ВЫБОР
| КОГДА ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) = 0
| ТОГДА 0
| ИНАЧЕ ВТ_ТабличнаяЧасть.Количество * ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) / ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0)
| КОНЕЦ КАК Сумма,
| ВТ_ТабличнаяЧасть.Количество - ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК Недостача,
| ВТ_ТабличнаяЧасть.НомерСтроки
|ИЗ
| ВТ_ТабличнаяЧасть КАК ВТ_ТабличнаяЧасть
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| &МоментВремени,
| (Товар, Серия) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_ТабличнаяЧасть.Товар,
| ВТ_ТабличнаяЧасть.Серия
| ИЗ
| ВТ_ТабличнаяЧасть КАК ВТ_ТабличнаяЧасть)) КАК ТоварыНаСкладеОстатки
| ПО ВТ_ТабличнаяЧасть.Товар = ТоварыНаСкладеОстатки.Товар
| И ВТ_ТабличнаяЧасть.Серия = ТоварыНаСкладеОстатки.Серия";
Далее установка параметров:
Запрос.УстановитьПараметр("МоментВремени", Новый Граница(Дата, ВидГраницы.Включая);
Недостачу можно анализировать прямо из результата запроса.
5. Сообщение стоит привязать к строке в табличном поле, для этого в запросе вычисляется номер первой строки с нехваткой:
6. При нехватке не устанавливается параметр “Отказ” в истину, то есть документ всё-равно проведётся.
Уже после цикла:
Движения.ТоварыНаСкладе.Загрузить(Результат.Выгрузить());
КонецЕсли;
Чтобы остатки получались корректные при перепроведении документа, нужно движения по товарам очистить и записать перед запросом остатков.
Так же стоит рассмотреть применение “новой” методики проведения документов.
Регистр накопления “ТоварыНаСкладе”
Тип ресурса “Количество” изменить с Число(15,2) на Число(15,3)
Вроде всё, что успел найти.
III) Помощь ближним
Ранее уже одобрили мой ответ на форуме, на всякий случай дублирую ссылку:
http://www.forum.mista.ru/topic.php?id=742458
Небольшое уточнение по повожу преопределенного элемента. Создавать ничего не нужно. Нужно устанавливать преопределенное значение основного поставщика
Виктор, благодарим Вас за развернутую обратную связь!
Финальное задание принято, поздравляем, с успешным окончанием курса!
Добрый вечер!
Ниже отчет по финальному заданию.
I) Обратная связь:
Из базового курса я узнала много нового, а именно: тонкости настройки интерфейсов и администрирования системы, механизмы работы с объектами БД, расчеты зп, основные понятия бухгалтерского учета. Весь предоставленный материал оказался исключительно полезным, предоставлен в понятном, а главное ненавязчивом и немонотонном виде. Являюсь новичком в программировании в 1с, уже применяю полученные знания для построения отчетов, исправления ошибок в модулях БД рабочих баз. Формат обучения оказался очень удобным, так как время обучения ежедневно можно корректировать.
С уважением, Филиппова Ирина, г.Москва
II) Практическая задача
1. В документе «Покупка товаров» выставлен флаг записи по регистру ТоварыНаСкладах в значение Истина
Движения.ТоварыНаСкладах.Записывать = Истина;
2. Добавлен документ «Продажа товаров» в качестве регистратора РН ТоварыНаСкладах
3. Документ «Покупка товаров» реквизит ТЧ Количество ставим тип Число (15,3).
4. Для документа «Продажа товаров» изменила запрос
А) для позиционирования ошибки добавлено выходное поле в запрос НомерСтроки
Б) соединение в связах таблиц изменено на левое, добавлено условие отбора товаров только из конкретного документа
В) в случае нехватки товаров проведение документа запрещаем путем выставления параметра процедуры Отказ в Истина.
Г) запись в регистр должна осуществляться, только если параметр Отказ = Ложь, поэтому добавляем условие.
Получилась следующая процедура:
Движения.ТоварыНаСкладе.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваровТовары.Товар КАК Товар,
| ПродажаТоваровТовары.Серия,
| ПродажаТоваровТовары.Количество КАК КолДок,
| ПродажаТоваровТовары.НомерСтроки,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| ,
| Товар В
| (ВЫБРАТЬ
| ПродажаТоваровТовары.Товар
| ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладеОстатки
| ПО ПродажаТоваровТовары.Товар = ТоварыНаСкладеОстатки.Товар
| И ПродажаТоваровТовары.Серия = ТоварыНаСкладеОстатки.Серия
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
ВыборкаТовары = Результат.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
Если Недостача>0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" серии " + ВыборкаТовары.Серия + " в количестве "+Недостача;
Сообщение.Поле = "Товары[" + (ВыборкаТовары.НомерСтроки-1) + "].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Если НЕ Отказ Тогда
Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
Запись.Период = Дата;
Запись.Товар = ВыборкаТовары.Товар;
Запись.Серия = ВыборкаТовары.Серия;
Запись.Количество = ВыборкаТовары.КолДок;
Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
КонецЕсли;
5. Кнопка «Проверка документа» не имеет смысл, так как в запросе идет поиск товаров с отрицательным количество. Отрицательное количество запрещено на уровне свойств реквизита.
6. Процедура кнопка «Заполнить клиента» документа «Покупка товаров» скорректирована. Получение значение основного поставщика необходимо выполнять в серверной внеконтекстной процедуре (так как методы глобального контекста недоступны на клиенте)
Процедура ЗаполнитьКлиента(Команда)
Объект.Клиент = ПолучитьОсновногоПоставщика();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьОсновногоПоставщика()
Возврат Справочники.Клиенты.ОсновнойПоставщик;
КонецФункции // ПолучитьОсновногоПоставщика()
7. Кнопка «Заполнить товары». Во-первых, нет типа Документ, необходимо использовать ДокументСсылка. Во-вторых, для получения типа ДокументОбъект использовать функцию РеквизитФормыВЗначение, после получения данных о ТЧ документа основания сделать обратные преобразования.
Процедура ЗаполнитьТовары(Команда)
Перем Основание;
ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
Если НЕ Основание.Пустая() Тогда
ЗаполнитьТоварыНаСервере(Основание);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ДокументОбъект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры // ЗаполнитьТоварыНаСервере()
8. Поле «Номер серии» это стандартный реквизит справочника «Код», в свойствах этого реквизита выставляем свойство Проверка заполнение в значение «выдавать ошибку».
9. Для того, чтобы при выборе реквизита Серия ТЧ Товары документа «продажа товаров» были доступны для выбора только серии, принадлежащие выбранному товару, выставляем свойство Связи параметров выбора в значение «Отбор.Владелец(Товары.Товар)».
III) Помощь начинающим
Так как я только начинаю програмировать на 1с, решила помочь начинающим на форумах.
Имя пользователя Iric28
http://forum-1c.ru/index.php?topic=47293.0
http://forum-1c.ru/index.php?topic=47297.new#new
http://forum-1c.ru/index.php?topic=45660.0
Здравствуйте, Ирина!
Благодарим вас за обратную связь.
Финальное задание принято. Поздравляем с успешным завершением курса и желаем удачи в дальнейшем обучении!
Здравствуйте! Итак отчет по ФЗ по шагам.
Шаг 1. Очень понравился курс. Подробные инструкции и детальное изложение, интересные домашние задания позволили мне как начинающему программисту 1С быстро разобраться во многих тонкостях платформы, систематизировать и закрепить свои знания в очень короткий срок. Понравилось что внимание акцентировалось не только на написание кода, но и на знание функционала программы. Связи конкретных механизмов с реальными задачами и примерами упростили понимание и особенно запоминание теории в целом и некоторых деталей в отдельности. В целом для меня курс заложил хорошую базу знаний для дальнейшей разработки в области управления и учета (наверное потому курс и называется базовым :) ), помог сделать первые шаги в освоении 1С. Очень удобен был гибкий график занятий, позволивший обучаться дома в удобное для меня время.
Мои контактные данные для обратной связи Попенко Ольга Алексеевна, город Чита (Забайкальский край).
Ну теперь отчет по практическому занятию.
Шаг 2. Исправление ошибок в представленной конфигурации
1. В стандартных реквизитах справочника Серии необходимо у реквизита Код установить свойство проверки заполнения в состояние Выдавать ошибку
ПокупкаТоваров
2. Табличная часть Товары, реквизит Количество – неверный тип строка – необходимо изменить на число с размерностью 15.3
3. На форме документа не вынесена кнопка команды ЗаполнитьТовары
4. В процедуре ЗаполнитьТовары правильно будет Тип(“ДокументСсылка.ПокупкаТоваров”) а не Тип(“Документ.ПокупкаТоваров”)
5. В процедуре ЗаполнитьТовары документа-основания не был выбран, то переменная Основание будет иметь тип Неопределено, и тогда метод Пустая() вызовет ошибку. Условие нужно ставить выше, на возвращаемое значение функции ВвестиЗначение.
6. Ошибка в процедуре ЗаполнитьКлиента в модуле формы, т.к. на клиенте не доступны методы сервера, а именно СправочникМенеджер. Поэтому в этой процедуре необходимо заменить Справочники.Клиенты.ОсновнойПокупатель на ПредопределенноеЗначение(“Справочник.Клиенты.ОсновнойПокупатель”) или использовать вызов серверной функции без контекста в которой возвращать Справочники.Клиенты.ОсновнойПокупатель
7. В процедуре ЗаполнитьТоварыНаСервере необходимо сделать вызов с контекстом, т.е. изменить компиляцию с &НаСервереБезКонтекста на &НаСервере или передавать в параметрах необходимый реквизит формы и затем преобразовать его в объект прикладного типа (использовать функцию РеквизитФормыВЗначение) иначе, если документ не был еще записан, произойдет ошибка времени исполнения.
8. Также в процедуре ЗаполнитьТоварыНаСервере ошибка при вызове метода Загрузить – этот метод загружает данные коллекции из таблицы значений, но почему то передается табличная часть Товары. Поэтому необходимо для табличной части вызвать метод Выгрузить: ДокументОснование.Товары.Выгрузить()
9. Документ ПокупкаТоваров не формирует движения. Не было команды на запись в регистр: Движения.ТоварыНаСкладе.Записывать = Истина;
ПродажаТоваров
10. В свойствах документа ПродажаТоваров на закладке Движения не было выставлено что он является регистратором для РН ТоварыНаСкладе.
11. В общем модуле ПроверкаДокументовСервер в свойствах не установлен Вызов сервера, в результате чего он не доступен для вызова из клиента.
12. Процедура проверить документ будет работать только для записанных документов. Так что, как вариант – необходимо перед проверкой записывать документ, что получать ссылку и потом использовать в запросе, т.е. нужно вставить команду Записать() перед вызовом процедуры ПроверкаДокументовСервер.ПроверитьДокумент(Объект.Ссылка)
13. Для реквизита Серия документа ПродажаТоваров в свойствах ПараметрыВыбора не был установлен отбор по владельцу.
14. В процедуре общего модуля используется процедура глобального контекста Предупреждение, доступная только на клиенте. Можно заменить на метод Сообщить или СообщениеПользователю, которые доступны на сервере.
15. В табличной части документа ПродажаТоваров и регистра ТоварыНаСкладе размерность поля Количество отличается. Необходимо привести ее к общему типу, например – число с размерностью 15.3.
16. В процедуре ОбработкаПроведения нужно Добавить в начале процедуры
Движения.ТоварыНаСкладе.Очистить();
Движения.ТоварыНаСкладе.Записать();
В запросе на получение остатков
17. добавить ПродажаТоваровТовары.НомерСтроки
18. сделать проверку isNULL для полей КолОст и СуммаОст
19. добавить условие ПродажаТоваровТовары.Ссылка = &Ссылка
20. Для виртуальной таблицы РегистрНакопления.ТоварыНаСкладе.Остатки необходимо добавить параметр Период – &Момент в запросе, и после установить его: Запрос.УстановитьПараметр(“Момент”,МоментВремени()).
21. В параметрах виртуальной таблицы также необходимо указывать серию, так как иначе остатки будут получены только по товарам.
22. Необходима группировка по полям Товар, Серия, где суммируемые поля: КолДок, КолОст, СуммаОст. Максимум по полю НомерСтроки
23. В условии Если Недостача>0 Тогда
Товары.Количество заменить наТовары[ВыборкаТовары.НомерСтроки].Количество
24. Для предотвращения деления на ноль можно использовать конструкцию Запись.Количество*?(ВыборкаТовары.КолОст=0,0,ВыборкаТовары.СумОст/ВыборкаТовары.КолОст)
25. При обнаружении недостаточности товара на складе (Недостача>0) документ не проводить – устанавливать параметр Отказ = Истина. Также перед добавлений записей в регистр полезной будет проверка: Если Не Отказ Тогда
Шаг 3.
Для отчета выбрала помощь на форуме, прилагаю ссылки с форума 1С (ник Ольгa):
http://forum-1c.ru/index.php?topic=47145.new#new
http://forum-1c.ru/index.php?topic=47298.new#new
В заключение желаю вам дальнейших творческих идей и успехов в вашей работе, продолжайте свое полезное, важное и нужное дело по подготовке специалистов 1С!
Здравствуйте, Ольга!
Благодарим Вас за обратную связь!
>В заключение желаю вам дальнейших творческих идей и успехов в вашей работе, продолжайте свое полезное, важное и нужное дело по подготовке специалистов 1С!
Спасибо :) желаем вам успехов в дальнейшем обучении!
Финальное задание принято, поздравляем с успешным окончанием базового курса!
Финальное ДЗ
Шаг1
Поскольку уже несколько лет занимаюсь программированием на 1с, то в основном пройдя курс, я освежил и структурировал свои знания. Новыми для меня были регистры расчета, потому как самостоятельно я их не изучал.
Поскольку на работе я не работаю с регистрами расчета новые навыки применить, пока не удалось.
Формат обучения очень удобный. Даже если отстаешь всегда можно выделить время на выходных и сократить отставание.
Проников Александр Игоревич Шатура.
Шаг 2
1) Справочник серии. Во-первых есть возможность того что номер серии будет состоять из цифр и букв и длина номера 9 маловата. Поэтому длину кода устанавливаем 15 и тип кода строка. Реквизит Срок годности не отражает полную картину по срокам. Желательно либо ввести дополнительный цифровой реквизит с указанием количества дней срока годности и из даты окончания срока и количества дней вычислять дату изготовления. Либо ввести дополнительный реквизит типа дата, в котором будет указываться конкретная дата изготовления. Также желательно включить контроль уникальности кода в пределах подчинения владельцу, чтобы исключить возможность появления двух серий с одинаковыми номерами у 1 товара. Для того чтобы поле номер серии (Код) сделать обязательным для заполнения свойство проверка заполнения стандартного реквизита код устанавливаем в значение выдавать ошибку.
2) В ТЧ Товары документа Закупка товаров количество должно быть число 15.3 а не строка.
3) В регистре Товары на складе ресурс Количество нужно сделать число 15.3 неотрицательное.
4) При проведении документа Закупка свойство записывать, набора записей ТоварыНаСкладе нужно установить в значение истина.
5) Кнопка заполнить клиента в документе закупка товаров не работает. Необходимо либо использовать серверный вызов, либо функцию «ПредопределенноеЗначение». И предопределенный контрагент не ОсновнойПокупатель а ОсновнойПоставщик.
6) Кнопка заполнить товары в документе закупка также не работает. При выборе основания указан не верный тип Тип(“Документ.ПокупкаТоваров”) а должен быть Тип(“ДокументСсылка.ПокупкаТоваров”). Вместо внеконтекстной процедуры ЗаполнитьТоварыНаСервере нужно использовать контектсный серверный вызов с использованием процедур РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.
7) Документ продажа товаров. В табличной части товары указать связь параметров выбора реквизита серии с реквизитом товары, чтобы ограничить выбор серий по товару. Выбрать регистр Товары на складе в свойствах движения для того чтобы документ мог делать движения по этому регистру. Свойство удаление движений из удалять при отмене проведения поставил в значение удалять автоматически.
8) В общем модуле ПроверкаДокументовСервер нужно выставить флаг вызов сервера.
9) В кнопке проверить документ вообще нет никакого смысла, потому как ошибочными считаются только строки, у которых количество < 0, что в принципе не возможно потому как у реквизита количество стоит флаг Неотрицательное. Также в место Предупреждение при нахождении ошибки лучше использовать Сообщение пользователю. Еще процедура проверяет только данные записанные в БД, если мы хотим проверить табличную часть не записного документа, то на сервер нужно передавать выгрузку табличной части в таблицу значений и ее уже обрабатывать. Если выяснить дополнительные условия, когда данные в таблице считаются не корректными можно попытаться ограничить возможность внесения ошибки да уровне настроек реквизитов. И если уже на уровне настроек не удастся ограничить возможность появления ошибки тогда можно заложить проверку в механизм с передачей выгрузки табличной части на сервер.
10) Процедура проведения документа продажа товаров некорректна. Во первых запрос не корректен вместо левого соединения внутреннее, нет ограничения по документу на таблицу товары, нет ограничения по сериям у таблицы остатков, момент времени документа никак не учитывается. Сообщение пользователю имеет некорректную привязку. В случае недостачи не происходит отмена проведения. Расчет суммы не корректен. Полный текст переписанной процедуры проведения в исходных кодах.
Исходный код исправлений:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ТоварыНаСкладе.Записывать=Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ТоварыНаСкладе.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовары.Товар;
Движение.Серия = ТекСтрокаТовары.Серия;
Движение.Количество = ТекСтрокаТовары.Количество;
Движение.Сумма = ТекСтрокаТовары.Сумма;
КонецЦикла;
КонецПроцедуры
// Кнопка заполнить клиента в документе закупка
&НаКлиенте
Процедура ЗаполнитьКлиента(Команда)
Объект.Клиент =ПолучитьКонтрагентаПоУмолчанию();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКонтрагентаПоУмолчанию()
Возврат Справочники.Клиенты.ОсновнойПоставщик;
КонецФункции
// Кнопка заполнить товары в документе закупка
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Перем Основание;
ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
Если НЕ Основание.Пустая() Тогда
ЗаполнитьТоварыНаСервере(Основание);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
ДокОбъект=РеквизитФормыВЗначение("Объект");
ДокОбъект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
ЗначениеВРеквизитФормы(ДокОбъект,"Объект");
КонецПроцедуры // ЗаполнитьТоварыНаСервере()
//Обработка проведения продажи товаров
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ТоварыНаСкладе.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваровТовары.Товар КАК Товар,
| ПродажаТоваровТовары.Серия,
| СУММА(ПродажаТоваровТовары.Количество) КАК КолДок,
| МАКСИМУМ(ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0)) КАК КолОст,
| МАКСИМУМ(ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0)) КАК СумОст,
| МАКСИМУМ(ПродажаТоваровТовары.НомерСтроки) КАК НомерСтроки
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| &МоментВремени,
| (Товар, Серия) В
| (ВЫБРАТЬ
| ПродажаТоваровТовары.Товар,
| ПродажаТоваровТовары.Серия
| ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка
| СГРУППИРОВАТЬ ПО
| ПродажаТоваровТовары.Товар,
| ПродажаТоваровТовары.Серия)) КАК ТоварыНаСкладеОстатки
| ПО ПродажаТоваровТовары.Товар = ТоварыНаСкладеОстатки.Товар
| И ПродажаТоваровТовары.Серия = ТоварыНаСкладеОстатки.Серия
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоваровТовары.Товар,
| ПродажаТоваровТовары.Серия";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Граница = Новый Граница(МоментВремени(),ВидГраницы.Исключая);
Запрос.УстановитьПараметр("МоментВремени", Граница);
Результат = Запрос.Выполнить();
ВыборкаТовары = Результат.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
Если Недостача>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
Сообщение.Поле = "Товары["+(ВыборкаТовары.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если не Отказ Тогда
Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
Запись.Период = Дата;
Запись.Товар = ВыборкаТовары.Товар;
Запись.Серия = ВыборкаТовары.Серия;
Запись.Количество = ВыборкаТовары.КолДок;
Запись.Сумма = Запись.Количество*ВыборкаТовары.СумОст/ВыборкаТовары.КолОст;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Шаг 3
forum.infostart.ru/forum26/topic54844/message1294947/ Сообщение № 2
forum.mista.ru/topic.php?id=742864 Сообщение № 4
Александр, благодарим вас за обратную связь!
Финальное задание принято, поздравляем с успешным окончанием базового курса!
ШАГ 1.
В результате прохождения курса получил много полезной информации, особенно касающейся периодических расчетов. До этого считал, что это что-то недосягаемое. Имеющиеся до этого знания “разложились по полочкам”. Теперь стараюсь к решению любой задачи подойти с разных сторон, чтобы оценить возможные последствия каждого варианта и выбрать наиболее оптимальный. Формат обучения считаю оптимальным, так как он позволяет самостоятельно планировать и корректировать объем изучаемого материала. Спасибо за прекрасный курс!
ШАГ 2.
Документ ПокупкаТовара
1. Тип значения строка в реквизите количество табличной части Товары. Действие : Изменить тип на Число 15.3.
2.В процедуре ЗаполнитьКлиента(Команда)
На клиенте недоступны методы обращения к базе данных
а) Заменить “Справочники.Клиенты.ОсновнойПокупатель” на “ПредопределенноеЗначение(“Справочник.Клиенты.ОсновнойПоставщик”)”;
или
б) Создать Функцию c компиляцией “&НаСервереБезКонтекста” и возвращать “Справочники.Клиенты.ОсновнойПокставщик”
3. В процедуре “ЗаполнитьТовары(Команда)” заменить Тип(“Документ.ПокупкаТоваров”) на Тип(“ДокументСсылка.ПокупкаТоваров”)
4. В процедуре “ЗаполнитьТовары(Команда)”
В условии “Если НЕ Основание.Пустая() Тогда” заменить на “Если ЗначениеЗаполнено(Основание) Тогда” чтобы не было ошибки если значение не выбрано
5.В процедуре “&НаСервереБезКонтекста
Процедура ЗаполнитьТоварыНаСервере(ТекущийДокумент, ДокументОснование)” заменить на “&НаСервере
Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)”
6.Процедура “ЗаполнитьТоварыНаСервере” может содержать одну строку
“Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());”
7. В процедуре “ОбработкаПроведения” добавить строку “Движения.ТоварыНаСкладе.Записывать=Истина;”
Документ ПродажаТоваров
8. Не отмечена что является регистратором для регистра накопления “ТоварыНаСкладе”
9. Вставить “Записать()” перед вызовом процедуры “ПроверкаДокументовСервер.ПроверитьДокумент(Объект.Ссылка)”
10. В общем модуле “ПроверкаДокументовСервер” включить вфлаг “ВызовСервера”
11. В процедуре “ПроверкаДокументовСервер” “Предупреждение” не доступно на сервере
заменить “СообщениеПользователю” или “Сообщить”
12. Добавить в начало процедуры “Обработка проведения” “Движения.ТоварыНаСкладе.Очистить();
Движения.ТоварыНаСкладе.Записать();”
13. Дляреквизита “Серия” добавить установку “Связь параметров выбора” по реквизиту “Товар”
14. В запросе заменить “внутренне” на “левое” соединение
15. В запросе добавить проверку на значение ЕСТЬNULL при получении остатков из регистра
16.Добавить условие “ПродажаТоваровТовары.Ссылка = &Ссылка” для основного запроса
17. добавить параметр для виртуальной таблицы “Период” “&МоментВремени” в запросе ,
процедуре Запрос.УстановитьПараметр(“МоментВремени”,МоментВремени()).
18. В запросе добавить группировку по Товар и Серии
19. Во вложенном запросе добавить выборку по Серии, чтобы не получать лишние данные для последующего соединения
Справочник Серии
20. Для обязательного заполнения в свойстве “Проверка заполнения” стандартного реквизита “Код” установить значение “Выдавать ошибку”
Начал с 31 потоком, в саппорте ответили, что можно сдать финал вместе с 36 потоком.
По сравнению с предыдущим курсом “1С:Программист – быстрый вход в профессию” шагнул очень далеко в плане развития навыков программирования. Очень многое стало понятным, вопросы которые остались после предыдущего курса в данном курсе нашли свои ответы. Хорошо, что все же приобрел базовый курс. Самым главным открытием для меня стало понимание связи М.Ф. и М.О в объекте документ. Дальше поразили инструменты, которые делают данные устойчивыми, а так же придают платформе универсальность. Практика с В.Т. и запросами в общем тоже очень сильно помогли в понимании 1С. На работе доступна только консоль запросов. Собственно в ней и штудирую свои навыки. Например, недавно составил огромный запрос, который возвращал нестандартную таблицу с данными и итогами. Эта таблица пригодилась для ответа на требование ИФНС, поскольку типовые отчеты не возвращали необходимые данные. По возможности читаю код типовых решений в копиях нашей ИБД, знакомлюсь с серьезными алгоритмами. Очень удобный формат обучения. Начал курс с августа 2014 с небольшим отставанием от графика потока. Когда почти нагнал, на пару месяцев отложил обучение из-за работы. С декабря продолжил и вот наконец досмотрел курс. Теперь, перед Продвинутым курсом буду знать, что лучше вовремя начинать и не отбиваться от графика потока. Хотя признаюсь, что 2 часа обучения каждый день – это многовато. Это еще при условии, если не смотреть *необязательные видео-материалы, а так же нужно не забыть про решение д/з и просмотра решений по ним, плюс разные видео-материалы в М-Г. Спасибо за курс всей команде Spec8 и отдельно Е. Гилеву!
Айзатуллин Ринат Рафикович, ведущий бухгалтер, Москва.
Решение практической задачи:
Ошибки в документе “Поступление”.
1) В МФ документа “Поступление” никак не обусловлено получение константы для Источника поступления. Для любого открытия формы источник берется из константы. Это неверно. Я дописал условие:
Объект.ИсточникПоступления = Константы.ОсновнойИсточник.Получить();
КонецЕсли;
2) Для стандартного реквизита Дата установлено значение заполнения “01.01.1980 0:00:00”. Это неправильно, убрал.
Ошибки в документе “ВыбытиеЖивотных”
3) Снова ошибка с получением константы ОсновноеНаправление в МФ. Она получается в клиентском событии. Исправил на событие “ПриСозданииНаСервере”.
4) Снова попадается мистическая дата “01.01.1980”. На этот раз, это недоразумение попадается при создании документа “ВыбытиеЖивотных”, а конкретно в событии МО “ОбработкаЗаполнения” в ветке Иначе условия сравнения с Т.Д. Это здесь скорее всего не нужно, закомментировал.
5) Ошибка в передаче параметра при получении отрицательных остатков при выбытии. Передается МоментВремени(), хотя было нужно так же включить границу. Я это доделал.
6) При условии нехватки животного указатель неверно определяет строку в ТЧ. В строке “Сообщение.Поле” дописал -1.
7-8) Нашел две грубые ошибки в запросе на контроль остатков. Во вложенной таблице “ДанныеДокумента” не установлен параментр отбора по Ссылке. Т.е. выбираются данные из всех документов. Ну а в параметре ВТ “РазмещениеЖивотныхОстатки” – условие, в сравнении Клетки и Животного, используется запрос без необходимой в таком случае группировок строк. Несмотря на то, что этот алгоритм отрабатывает, я все же внес данные изменения.
Ошибка в документе “ПеремещениеЖивотных”
9) Я думаю в МО документа “ПеремещениеЖивотных” в событии “ОбработкаПроведения” будет правильным движения Приход и Расход записывать отдельно, а в случае с Приходом (т.е. куда будет перемещено животное) вообще записывать только в том случае, если после контроля остатка с учетом Расхода параметр события Отказ не равен Истине.
Ошибка в отчете “РазмещениеЖивотных”
10) В СКД отчета “РазмещениеЖивотных” неправильно задается параметр, он не включает конец дня и последнюю секунду. Я это исправил:
В толстом клиенте после отладки на тонком клиенте, ошибок не обнаружено.
Помощь Миру:
http://forum-1c.ru/index.php?topic=47292.msg135470#msg135470
Ответ с пометкой “PS Финальное д/з”
Ринат, благодарим вас за развернутый отзыв!
Финальное задание принято! Поздравляем с успешным окончанием базового курса!
Добрый день.
Мой отзыв по курсу:
С системой 1С работаю уже больше полугода в качестве специалиста технической поддержки, программировать приходилось в минимальном количестве, обладая минимальными знаниями. Благодаря базовому курсу мне удалось значительно повысить свою квалификацию и теперь я выполняю сложные задачи по программированию в рамках нашего предприятия, например, была написана обработка по проведению корректирующих и предупреждающих мероприятий на производстве и отчет по ней.
Хочется отдельно отметить удобный формат обучения. Несравненным плюсом является то, что к просмотру занятий можно приступить в любой удобный момент времени, несколько раз приходилось пересматривать один и тот же материал для лучшего усвоения.
Практическое задание:
1. Запуск 1С Предприятия Толстый клиент (управляемое приложение) меняем на Выбирать автоматически.
2. Документ “ПокупкаТоваров”.
Для корректной работы кнопки “Заполнить клиента” на форме документа, создаем предопределенный элемент “ОсновнойПокупатель” в справочнике “Клиенты”.
Ошибка при нажатии кнопки “Заполнить товары”, правильнее будет
Документ не делает движение по регистру. В Обработку проведения добавляем свойство Записывать = Истина.
Заполнение товаров на сервере. Следует делать контекстный серверный вызов и загружать таблицу значений в основной реквизит формы — Объект. И исправленный запрос:
Процедура ЗаполнитьТоварыНаСервере(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПокупкаТоваровТовары.НомерСтроки,
| ПокупкаТоваровТовары.Товар,
| ПокупкаТоваровТовары.Серия,
| ПокупкаТоваровТовары.Количество,
| ПокупкаТоваровТовары.Сумма
|ИЗ
| Документ.ПокупкаТоваров.Товары КАК ПокупкаТоваровТовары
|ГДЕ
| ПокупкаТоваровТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить().Выгрузить();
Объект.Товары.Загрузить(Результат);
КонецПроцедуры // ЗаполнитьТоварыНаСервере()
3. Документ “ПродажаТоваров”.
Включаем его в регистраторы для регистра ТоварыНаСкладе.
В обработке проведения, запрос выбирает данные по всем документам, а не только по текущему, остатки выбираются только по номенклатуре без учета серий, не хватает условия остатков на дату, документ проводится при недостатке товара. Исправленная обработка проведения:
Движения.ТоварыНаСкладе.Записывать = Истина;
Движения.ТоварыНаСкладе.Очистить();
Движения.ТоварыНаСкладе.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваровТовары.Товар КАК Товар,
| ПродажаТоваровТовары.Серия,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст,
| ПродажаТоваровТовары.Количество КАК КолДок,
| ПродажаТоваровТовары.НомерСтроки
|ИЗ
| (ВЫБРАТЬ
| ПродажаТоваровТовары.Товар КАК Товар,
| ПродажаТоваровТовары.Серия КАК Серия,
| СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
| СУММА(ПродажаТоваровТовары.Сумма) КАК Сумма,
| ПродажаТоваровТовары.НомерСтроки КАК НомерСтроки
| ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ГДЕ
| ПродажаТоваровТовары.Ссылка.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| ПродажаТоваровТовары.Товар,
| ПродажаТоваровТовары.Серия,
| ПродажаТоваровТовары.НомерСтроки) КАК ПродажаТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| &МоментВремени,
| (Товар, Серия) В
| (ВЫБРАТЬ
| ПродажаТоваровТовары.Товар,
| ПродажаТоваровТовары.Серия
| ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладеОстатки
| ПО ПродажаТоваровТовары.Товар = ТоварыНаСкладеОстатки.Товар
| И ПродажаТоваровТовары.Серия = ТоварыНаСкладеОстатки.Серия";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Запрос.УстановитьПараметр("МоментВремени", Неопределено);
Иначе
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
КонецЕсли;
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
ВыборкаТовары = Результат.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
Если Недостача>0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
Сообщение.Поле = "Товары["+(ВыборкаТовары.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Если Отказ Тогда
Продолжить
КонецЕсли;
Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
Запись.Период = Дата;
Запись.Товар = ВыборкаТовары.Товар;
Запись.Серия = ВыборкаТовары.Серия;
Запись.Количество = ВыборкаТовары.КолДок;
Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
4. В свойствах модуля ПроверкаДокументовСервер не хватает галочки ВызовСервера, чтобы к ней можно было обращаться с клиента.
Но даже если поставить эту галочку, подход к проверке всё равно неверный, потому что при такой реализации мы будем проверять сохранённый документ, а не текущий. Следует разместить процедуру проверки в клиентском контексте модуля формы.
Более того, без этой проверки можно вообще обойтись, поскольку для реквизита «Количество» установлен признак Неотрицательный. То есть ввести отрицательное значение в форму документа в принципе невозможно.
5. Обязательное заполнение “Номера серии” в справочнике “Серии”: Поскольку у нас нет реквизита “Номер серии”, вместо него выступает стандартный реквизит “Код”, у которого в свойстве “Проверка заполнения” мы ставим “Выдавать ошибку”.
В качестве шага 3 я решила провести мини-семинар среди коллег дабы уговорить их потихонечку переходить на управляемые формы, сейчас работаем с обычными. Фотоотчет обязуюсь предоставить в понедельник 18.05.
upd. 18.05.15
Фотографии мини-семинара отправила на почту mg@spec8.ru :)
Добрый день!
Письмо получили.
Благодарим Вас за отзыв и поздравляем с успешным окончанием базового курса по программированию!
Соколов Р.В., Москва, ООО “ЕДС”, программист 1С
Шаг 1. Вопросы по курсу
– в каждом блоке узнавал для себя что-то новое, существующие знания расширялись и под них легла Ваша хорошая фундаментальная база.
– серьезно осознал, что не имея знания базовых принципов бух учета будет трудно работать в прикладной области (т.е. поддерживать и дорабатывать текущий функционал линейки 1С)
– на практике каждый просмотр курса блока или видео из мастер-группы приводил к рефакторингу моей рабочей конфигурации, повышалась читаемость и абстракция кода, функциональность и быстродействие приложния
– конечно имея видео-уроки очень удобно распоряжаться своим временем и не быть жестко привязанным к графику посещений очных лекций. Огромное количество международных образовательных сервисов в интернете уже давно тренд.
Еще раз спасибо за Ваш вклад в мое самообразование. Всем Вас рекомендую именно покупать, т.к. цены доступные + проводятся скидки + бесплатные материалы и Вы всегда на переднем фронте инноваций 1С
Осталось отдохнуть и приниматься за продвинутый! :)
Шаг 2. Практическое задание
– настроим командный интерфейс рабочего раздела для юзабилити (документы – важное, справочники – обычное, регистр – см. также)
– в справочнике Серии для реквизита Код (номер серии) свойство проверка заполнения => “Выдавать ошибку”. Так поле будет обязательным для заполнения и Виола Григорьевна будет довольна.
– в справочнике Серии для реквизита СрокГодности свойство проверка заполнения => “Выдавать ошибку”. Так поле будет обязательным для заполнения и сертификат теперь будет записан только при заполнении номер серии и срок годности.
– в справочнике Серии контроль уникальности серии кодов лучше выставить в “в пределах подчинения владельцу” (зависит от бизнес-логики)
Документ ПокупкаТоваров
– в ТЧ Товары меняем тип реквизита “Количество” с Строка(10) на Число(15,3) неотрицательное
– добавляем реквизит СуммаДокумента и заполняем ее в модуле объекта ПередЗаписью
ЭтотОбъект.СуммаДокумента = ЭтотОбъект.Товары.Итог("Сумма");
КонецПроцедуры
– добавляем форму выбора документа (будет удобно при подборе видеть реквизиты дата, номер, клиент, суммадокумента)
– в обработку проведения добавляем строку (для записи набора данных в РН)
– добавляем константу “КонтрагентПоУмолчанию” и замыкаем алгоритм на нее
Процедура ЗаполнитьКлиента(Команда)
Объект.Клиент = КонтрагентПоУмолчанию();
КонецПроцедуры
&НаСервереБезКонтекста
Функция КонтрагентПоУмолчанию()
Возврат Константы.КонтрагентПоУмолчанию.Получить();
КонецФункции
– отлаживаем команду ЗаполнитьТовары и добавляем вопрос, если ТЧ содержит записи
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Перем ДокументОснование;
ВвестиЗначение(ДокументОснование, “Выберите документ-основание”, Тип(“ДокументСсылка.ПокупкаТоваров”));
Если ЗначениеЗаполнено(ДокументОснование) Тогда
Если Объект.Товары.Количество()>0 Тогда
ответНаВопрос = Вопрос(“Таблица товары будет заменена данными из выбранного документа. Продолжить?”, РежимДиалогаВопрос.ДаНет);
Если ответНаВопрос=КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли;
КонецЕсли;
ЗаполнитьТоварыНаСервере(ДокументОснование);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТоварыНаСервере(Знач ДокументОснование)
Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
КонецПроцедуры
- делаем запрет на оперативное проведение
Документ ПродажаТоваров
- делаем запрет на оперативное проведение
- в движения добавляем РН ТоварыНаСкладе
- в ТЧ Товары для реквизита Серия устанавливаем связи параметров выбора "Отбор.Владелец(Товары.Товар)"
- для общего модуля ПроверкаДокументовСервер - ставим галочку "Вызов сервера" и вызываем СообщениеПользователю, т.к. Предупреждение не работает на сервере
На реквизит стоит запрет на отрицательное значение, поэтому проверка избыточна, а вообще имеет смысл убрать эту проверку на клиент и делать обход контейнера Товары, т.к. запрос работает только от записанного документа.
- добавляем реквизит СуммаДокумента и заполняем ее в модуле объекта ПередЗаписью
<code>
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ЭтотОбъект.СуммаДокумента = ЭтотОбъект.Товары.Итог("Сумма");
КонецПроцедуры
– проведение документа
Существующий код использует старый алгоритм проведения и содержит ошибку соединения таблицы товаров и остатков.
Сначала очистим набор записей, чтобы предыдущие движения не влияли на проверку остатков
Также в запросе к виртуальной таблице Остатки выбираются на вхождение только уникальные товары а условие на серии отсутствует.
Сообщение о нехватке товара будем выводить с привязкой к строкеТЧ для минимального номера строки ТЧ Товары
Введем расчет остатков на границу времени
Формулу расчета суммы сделаем с учетом нехватки, чтобы регистр накопления выводить в ноль
В формуле расчета суммы сначала сделаем умножение, а деление уберем в конец
Чтобы избежать ненужных вычислений – проверяем Отказ, сообщения об ошибке выводим, а окончательную запись набора в регистр не делаем
Исправим код
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Товар,
| Т.Серия,
| СУММА(Т.Количество) КАК КолДок,
| МИНИМУМ(Т.НомерСтроки) КАК НомерСтроки
|ПОМЕСТИТЬ ТоварыДокумента
|ИЗ
| Документ.ПродажаТоваров.Товары КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| Т.Товар,
| Т.Серия
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Т1.Товар,
| Т1.Серия,
| Т1.КолДок,
| Т1.НомерСтроки КАК НомерСтроки,
| ISNULL(Т2.КоличествоОстаток, 0) КАК КолОст,
| ISNULL(Т2.СуммаОстаток, 0) КАК СумОст
|ИЗ
| ТоварыДокумента КАК Т1
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| &НаДату,
| (Товар, Серия) В (ВЫБРАТЬ РАЗЛИЧНЫЕ Т.Товар, Т.Серия ИЗ ТоварыДокумента КАК Т)
| ) КАК Т2
| ПО Т1.Товар=Т2.Товар И Т1.Серия=Т2.Серия
|УПОРЯДОЧИТЬ ПО
| НомерСтроки
|";
Запрос.УстановитьПараметр("НаДату", Новый Граница(МоментВремени(), ВидГраницы.Включая) );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
ВыборкаТовары = Запрос.Выполнить().Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
Если Недостача>0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" (серия "+ВыборкаТовары.Серия+") в количестве " + Недостача;
Сообщение.Поле = "Товары["+Формат(ВыборкаТовары.НомерСтроки-1, "ЧГ=0")+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Если Отказ Тогда Продолжить; КонецЕсли;
Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
Запись.Период = Дата;
Запись.Товар = ВыборкаТовары.Товар;
Запись.Серия = ВыборкаТовары.Серия;
Запись.Количество = ВыборкаТовары.КолДок;
Если Недостача=0 Тогда
Запись.Сумма = ВыборкаТовары.СумОст;
Иначе
Запись.Сумма = ВыборкаТовары.СумОст*ВыборкаТовары.КолДок/ВыборкаТовары.КолОст;
КонецЕсли;
КонецЦикла;
Если Не Отказ Тогда
Движения.ТоварыНаСкладе.Записать();
КонецЕсли;
Можно переделать алгоритм под новый стандарт (сначала проведение, затем контроль остатков, если всего хватает высчитываем по другому регистру себестоимость по среднему или среднескользящему)
только количественный учет
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ТоварыНаСкладе.ДобавитьРасход();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовары.Товар;
Движение.Серия = ТекСтрокаТовары.Серия;
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;
Движения.ТоварыНаСкладе.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Товар,
| Т.Серия,
| СУММА(Т.Количество) КАК Количество,
| МИНИМУМ(Т.НомерСтроки) КАК НомерСтроки
|ПОМЕСТИТЬ ТоварыДокумента
|ИЗ
| Документ.ПродажаТоваров.Товары КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| Т.Товар,
| Т.Серия
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Т1.Товар,
| Т1.Серия,
| Т1.Количество,
| Т1.НомерСтроки КАК НомерСтроки,
| Т2.КоличествоОстаток,
|ИЗ
| ТоварыДокумента КАК Т1
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| &НаДату,
| (Товар, Серия) В (ВЫБРАТЬ РАЗЛИЧНЫЕ Т.Товар, Т.Серия ИЗ ТоварыДокумента КАК Т)
| ) КАК Т2
| ПО Т1.Товар=Т2.Товар И Т1.Серия=Т2.Серия
|ГДЕ
| Т2.КоличествоОстаток < 0
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки
|";
Запрос.УстановитьПараметр("НаДату", Новый Граница(МоментВремени(), ВидГраницы.Включая) );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Отказ = Истина;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+Выборка.Товар+" (серия "+Выборка.Серия+") в количестве " + -Выборка.КоличествоОстаток;
Сообщение.Поле = "Товары["+Формат(Выборка.НомерСтроки-1, "ЧГ=0")+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
И если НЕ Отказ далее вести расчет по себестоимости в другом регистре
РН ТоварыНаСкладе
– меняем тип ресурса “Количество” с Число(15,2) на Число(15,3)
Шаг 3. Помощь ближним
Буквально месяц назад в офисе рассказывал про фишки 8.3 (сейчас работа удаленно) – фото к сожаление не делал, но стенд маркером изрисовал)
– первая тема была про новый метод модуля менеджера объекта ОбработкаПолученияФормы – цель подменять вызов типовой формы на свою
– вторая тема была про свои представления объектов с правильным использованием ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления
– третья тема была про метод ОбработкаПолученияДанныхВыбора – с помощью него добились ускорения ввода адреса из огромного справочника адресов
В ближайшем будущем допилю и выложу обработку по формированию Excel файлов с отчетами и склеиванию листов Excel в один файл.
+ к шагу №3
http://forum.infostart.ru/forum86/topic131073/ сообщения(7,12,20)
Благодарим вас за обратную связь!
Финальное задание принято. Поздравляем с успешным окончанием базового курса по программированию!
Лазарева Ирина Александровна, г.Томск
Поскольку я пока не волшебница, а только учусь, то все знания, предложенные мне в данном курсе, являются исключительно полезными для меня.
После прохождения базового курса несомненно укрепились знания, полученные мной в курсе быстрого старта. Многое стало понятнее. Но кроме этого я получила много новой информации, которую еще пережевываю.
Кстати, порадовало то, что курсы БС и Базовый не дублируются, а информация преподносится так, чтобы было полное видение картины.
Отдельно хотелось бы отметить форму курсов. Это сто процентов мой вариант. Очные курсы мне предлагали пройти за 2 недели. Поскольку я уже сталкивалась с 1С, то меня это факт остановил сразу. Но теперь я действительно представляю, что знаний я бы оттуда вынесла минимум. А если еще учесть, что я мама двух детей, то вариант “учусь когда время есть” – это просто супер.
Теперь по заданию.
1) Справочник “Серии” .
Длина наименования явно маловата, сделаем = 15.
Тип кода лучше использовать строку.
Сделаем поле “Код” обязательным для заполнения.Стандартные реквизиты\Код\Проверка заполнения = Выдавать ошибку.
Не выполняется контроль уникальности кода. Установим его. Нумерация: Контроль уникальности – истина.
2) Справочник “Товары”.
Поскольку справочник иерархический, то ограничим уровень иерархии до 4.
3) Свойства Справочника “Клиенты”.
Начнем с того, что в данном справочнике хранятся данные не только о клиентах, но и о поставщиках фирмы, поэтому название
справочника считаем не удачным, исправляем на “Контрагенты”. И поскольку справочник иерархический, то также ограничим иерархию
до 3 уровней.
4)Документ “Покупка товаров”.
Наименование реквизита документа “Клиент” аналогично справочнику “Клиенты” не отражает сути, посему переименовываем его в
“Поставщик”.
Реквизит табличной части “Количество” почему-то имеет тип Строка, исправляем на тип Число 15,3 неотрицательное.
5)Документ “Продажа товаров”.
В реквизите табличной части “Серия” настроим связи параметров выбора – Отбор по владельцу, владельцем является реквизит табличной
части “Товар”.
6)Регистр накопления “ТоварыНаСкладе”.
Думаю, то, что ресурсы данного регистра должны являться обязательными для заполнения. Проверка заполнения = Выдавать ошибку.
Поскольку данный регистр является регистром остатков, то регистраторами для него должны быть оба документа – “Покупка товаров”
и “Продажа товаров”.
7)Движения документа “Поступление товаров”.
При проведении данного документа не ведется запись движений по регистру ни в явном ни в неявном виде.
Перед циклом добавляем строку Движения.ТоварыНаСкладе.Записывать = Истина;
8)Движения документа “Продажа товаров”.
В запросе для связи двух таблиц используется внутреннее соединение, т.е проверяются на наличие только те товары,
которые есть на складе. Т.о. можно продать товар, которого на складе нет. Исправим данную ситуацию. Сделаем левое соединение
двух таблиц и учтем, что количество и сумма на складе могут быть нулевыми.
Кроме этого выбираются товары их всех документов продажи, а нас интересует только текущий документ. Поэтому на таблицу
документа наложим условие по ссылке.
А также для отображения сообщений выберем номер строки в таблице документа.
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваровТовары.Товар КАК Товар,
| ПродажаТоваровТовары.Серия,
| ПродажаТоваровТовары.Количество КАК КолДок,
| ПродажаТоваровТовары.НомерСтроки,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| ,
| Товар В
| (ВЫБРАТЬ
| ПродажаТоваровТовары.Товар
| ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладеОстатки
| ПО ПродажаТоваровТовары.Товар = ТоварыНаСкладеОстатки.Товар
| И ПродажаТоваровТовары.Серия = ТоварыНаСкладеОстатки.Серия
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
В случае недостатка товара на складе выдается предупреждение пользователю, но проведение документа всё равно осуществляется.
Поставим флаг “Отказ” в истину. И запись движения формируем при условии, что количества продаваемого товара достаточно, т.о.
не будет деления на 0.
Сообщение пользователю также скорректируем, дополним серию и корректно спозиционируем.
Сумма списания формируется по средней, но во избежании неточного округления, формулу немного изменим – сначала умножение,
затем деление.
Пока ВыборкаТовары.Следующий() Цикл
Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
Если Недостача>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" серии "+ВыборкаТовары.Серия+" в количестве "+Недостача;
Сообщение.Поле = "Товары["+(ВыборкаТовары.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Не Отказ Тогда
Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
Запись.Период = Дата;
Запись.Товар = ВыборкаТовары.Товар;
Запись.Серия = ВыборкаТовары.Серия;
Запись.Количество = ВыборкаТовары.КолДок;
Запись.Сумма = ВыборкаТовары.СумОст*Запись.Количество/ВыборкаТовары.КолОст;
КонецЕсли;
КонецЦикла;
9) Команда “Заполнить клиента” документа “Покупка товаров” не рабочая.
Переделываем с самого начала. Назовем команду “Заполнить поставщика” и в модуле формы опишем команду
Процедура ЗаполнитьПоставщика(Команда)
Объект.Поставщик = ПолучитьОсновногоПоставщика();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьОсновногоПоставщика()
Возврат Справочники.Контрагенты.ОсновнойПоставщик;
КонецФункции // ПолучитьОсновногоПоставщика()
Заодно и исправим команду “Заполнить товары”.
Процедура ЗаполнитьТовары(Команда)
Перем Основание;
ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
Если НЕ Основание.Пустая() Тогда
ЗаполнитьТоварыНаСервере(Основание);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТоварыНаСервере( ДокументОснование)
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры // ЗаполнитьТоварыНаСервере()
10) Что касается команды “Проверка документа”. Я считаю, что она совершенно излишня, т.к. достаточно в свойствах реквизита “Количество” табличной части поставить свойство “Неотрицательное” в значение Истина и система сама не даст указывать отрицательное число в данном столбце.
Ирина, благодарим вас за отзыв по курсу!
Практическое задание принято, ждем от Вас отчета по шагу №3.
Здравствуйте.
Третий шаг финала:
http://forum-1c.ru/index.php?topic=47252.new#new
http://forum-1c.ru/index.php?topic=47301.new#new
ник Rolliielf.
Ну в общем чем смогла :)
Здравствуйте!
Принято, Вы в списке финалистов :)
ШАГ 1
Здравствуйте!
Я являюсь программистом 1С довольно давно. 8 лет назад получил сертификат Специалиста по Бухгалтерии 77. До недавнего времени занимался в основном поддержкой самописной конфигурации на базе 1С:Предприятние 77. С 2013 года осуществляю поддержку базы УПП.
В целом в курсе для меня было довольно много знакомого материала, но было много и “белых пятен”. Я знал основные прикладные объекты конфигурации, работу механизмов оперативного и бухгалтерского учета. Для меня наиболее информативными было: тонкий клиент, управляемые формы и часть по расчетным механизмам.
Считаю для себя прохождение данного курса полезным. Планирую прохождение Продвинутого курса.
По сравнению с очными курсами, формат интернет курса имеет плюсы и минусы. Для прохождения интернет курса необходима бОльшая самоорганизованность: если посмотреть по количеству комментариев, то видно, что только каждый 2-й или даже 3-й выполняет все задания.
Основным плюсом я считаю возможность получить большой объем материала в удобное время. Основным минусом менее удобное общение преподаватель – студент.
В целом я считаю, что для полноценного обучения программированию в разумные сроки и финансовые затраты наиболее оптимально основной объем информации получить на ваших курсах, а очные курсы посетить более узкоспециализированные, где можно непосредственно пообщаться с преподавателем и коллегами. Хотя сейчас уже, наверное, нет тем, которые бы освещались на очных курсах и не присутствовали бы в ваших.
С уважением,
Мохов Евгений Владимирович, Заместитель начальника отдела ИТиС ОАО “Газпром газораспределение Ярославль”
ШАГ 2
Исправить тип значения реквизита Количество документа “ПокупкаТоваров” со “Строка” на “Число 15.3”
Исправить тип значения реквизита Количество регистра накопления “ТоварыНаСкладе” с “Число 15.2” на “Число 15.3”
В процедуре ОбработкаПроведения документа “ПокупкаТоваров” добавить строчку “Движения.ТоварыНаСкладе.Записывать = Истина;”
В модуле формы документа “Покупка товаров”
1. Из процедуры ЗаполнитьКлиента нужно делать серверный внеконтекстный вызов для получения основного покупателя, хотя лучше сделать это в общем модуле.
2. В процедуре ЗаполнитьТовары “Тип(“Документ.ПокупкаТоваров”)” заменить на строку “Тип(“ДокументСсылка.ПокупкаТоваров”)”;
3. В процедура ЗаполнитьТоварыНаСервере объявлена серверной контекстной и внесены соответствующие изменения.
4. Заполнение табличной части лучше организовать через механизм ввода на основании, но возможно это уже считается изменение функционала, поэтому я это не исправлял.
Результат модуля формы
Процедура ЗаполнитьКлиента(Команда)
Объект.Клиент = ПолучитьОсновногоПоставщика();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьОсновногоПоставщика()
Возврат Справочники.Клиенты.ОсновнойПоставщик;
КонецФункции
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Перем Основание;
ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
Если НЕ Основание.Пустая() Тогда
ЗаполнитьТоварыНаСервере(Основание);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
КонецПроцедуры // ЗаполнитьТоварыНаСервере()
Для общего модуля “ПроверкаДокументовСервер” установить флаг “Вызов сервера”
В модуле строка “Предупреждение(“Ошибка в строке № “+Выборка.НомерСтроки+” количество не может быть отрицательным!”, 5);” заменена на
Сообщение.Текст = "Количество не может быть отрицательным!";
Сообщение.Поле = "Товары["+(Выборка.НомерСтроки-1)+"].Количество";
Сообщение.КлючДанных = Документ;
Сообщение.ПутьКДанным = "Объект";
Сообщение.Сообщить();
так как процедура “Предупреждение” не доступна на сервере.
Для возможности тестирования в реквизите “Количество” документа “Продажа товаров” снят флан “Неотрицательное”
В документе “Продажа товаров” установлено что он может быть регистратором для регистра “ТоварыНаСкладе”
Для реквизита “Серия” установить связи параметров выбора с отбором по владельцу “Товар”
При проведении в запросе изменено соединение с ВНУТРЕННЕЕ на ЛЕВОЕ. Добавлен параметр “Период” при получении остатков по регистру
При запросе остатка по регистру отбор делается не по Товару а по комбинации “Товар, Серия”
Убраны дубли строк, получен номер строки для вывода сообщения о нехватке.
Так же воспользоваться функцией IsNull при вычислении полей КолОст и СумОст
В начале процедуры ОбработкаПроведения нужно сделать явную запись движений по регистру, чтобы движения по текущему документу не учитывались при запросе остатков
В задании не указано нужно ли предупреждать появление отрицательных остатков, поэтому произведен только контроль нулевого количества на остатке для расчета себестоимости.
Итоговый модуль проведения документа
Движения.ТоварыНаСкладе.Записать();
Движения.ТоварыНаСкладе.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст,
| ВложенныйЗапрос.Товар,
| ВложенныйЗапрос.Серия,
| ВложенныйЗапрос.Количество КАК КолДок,
| ВложенныйЗапрос.НомерСтроки
|ИЗ
| (ВЫБРАТЬ
| ПродажаТоваровТовары.Товар КАК Товар,
| ПродажаТоваровТовары.Серия КАК Серия,
| СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
| МИНИМУМ(ПродажаТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|
| СГРУППИРОВАТЬ ПО
| ПродажаТоваровТовары.Серия,
| ПродажаТоваровТовары.Товар) КАК ВложенныйЗапрос
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| &МоментВремени,
| (Серия, Товар) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПродажаТоваровТовары.Серия,
| ПродажаТоваровТовары.Товар
| ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладеОстатки
| ПО ВложенныйЗапрос.Товар = ТоварыНаСкладеОстатки.Товар
| И ВложенныйЗапрос.Серия = ТоварыНаСкладеОстатки.Серия";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Результат = Запрос.Выполнить();
ВыборкаТовары = Результат.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
Если Недостача>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
Сообщение.Поле = "Товары["+(ВыборкаТовары.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
Запись.Период = Дата;
Запись.Товар = ВыборкаТовары.Товар;
Запись.Серия = ВыборкаТовары.Серия;
Запись.Количество = ВыборкаТовары.КолДок;
Если ВыборкаТовары.КолОст = 0 Тогда
Запись.Сумма = ВыборкаТовары.СумОст;
Иначе
Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для того чтобы сделать номер серии обязательным к заполнению нужно в справочнике “Серии” на закладке “Данные” открыть Стандартные реквизиты и для реквизита “Код” установить проверку заполнения “Выдавать ошибку”
ШАГ 3 Помощь ближним.
Принял участие в решении вопросов на форуме http://forum-1c.ru. Имя пользователя Евгений@
Темы:
http://forum-1c.ru/index.php?topic=47166
http://forum-1c.ru/index.php?topic=47229
http://forum-1c.ru/index.php?topic=47201
http://forum-1c.ru/index.php?topic=47200
http://forum-1c.ru/index.php?topic=47184
Здравствуйте, Евгений!
Благодарим вас за развернутую обратную связь!
Финальное задание принято, поздравляем с успешным завершением базового курса!
Добрый день. Подойдёт ли для зачёта по третьей части задания следующий вопрос:
http://www.forum.mista.ru/topic.php?id=742458
Мой коммент на данный момент последний(ник – GorbonosovV). Собственно решение было найдено до меня автором темы, но на мой взгляд уж очень кривое, а других вариантов пока нет.
Добрый день. Да, подойдет :)
1) Отзыв
В курсе во всех разделах нашел для себе что-то новое. Механизм расчетов не знал совсем, но просмотрев видеоматериалы и самостоятельно прорешав задания, без проблем разобрался с основными понятиями и базовыми принципами работы механизма. Считаю это показателем высокого качества материалов.
Из уже известного лучше разобрался с регистрами и в частности с виртуальными таблицами регистров. Очень помогло при написании отчетов.
По мере прохождения курса значительно уменьшилось время отладки , стал лучше ориентироваться в синтакс-помощнике, стало намного проще понимать чужой код. Также стали понятными некоторые типовые приемы, используемые в типовых конфигурациях.
Благодаря формату видеокурса удобно повторять моменты, оказавшиеся трудными для понимания.
Вишняков С.И., программист-консультант, г.Астрахань.
2) Практическое задание
В тонком клиенты в документе “Выбытие” ошибка при получении константы “ОсновноеНаправление” из-за того, что получение происходит на клиенты в процедуре “ПриОткрытии”. – Перенести получение констатанты на сервер, например, в процедуру “ПриСозданииНаСервере”
В документе “Поступление” реквизит “Дата” по умолчанию заполняется 1980 годом. – Убрать значение заполнения и проверку заполнения.
В документе “Выбытие” реквизит “Дата” по умолчанию заполняется 1980 годом. – Убрать заполнение реквизита “Дата” из процедуры “ОбработкаЗаполнения”.
В документе “ВыбытиеЖивотных” при проверке остатков не учитываются движения текущего документа – Установить в параметре “МоментВремени” границу включая.
В документе “ВыбытиеЖивотных” при проверку остатков во вложенном запросе “ДанныеДокумента” не установлен отбор по текущему документу. – В секции “Условия” наложить отбор по ссылке.
В документе “ВыбытиеЖивотных” при выводе сообщения о нехватке позиционирование происходит в неправильное поле. – Необходимость вычесть из номера строки единицу, так как индекс табличной части начинается с нуля
Регистр “ВыбытияЖивотных” имеет вид “Остатки”. – Сделать его оборотным, так как в нем регистрируются только выбытия, поступлений нет.
В отчет “РазмещениеЖивотных” не попадают перемещения, сделанные в последнюю секунду дня – Необходимо добавить секунду к параметру “Период”.
3) Помощь
Ник enniskillen
http://forum-1c.ru/index.php?topic=47155
http://forum-1c.ru/index.php?topic=47156
Сергей, благодарим Вас за отзыв!
Финальное задание принято, поздравляем с успешным окончанием базового курса и желаем успехов в дальнейшем обучении!
!!!ВНИМАНИЕ ПРОВЕРЯЮЩИЙ
в документе указано задание по базе с животными, база совсем другая
Сделал и для выложенной базы и для базы с животными (заранее)
Проверьте, может быть базу надо заменить.
Никитин Григорий, г. Москва
(P.S. Это персональные данные, вы должны автоматом определять финалистов по логину, т.к. на него куплен курс, там указаны данные.
Оставлять в комментариях – никуда не годится!!!)
Шаг1.
Базовый курс стал для меня логическим развитием знаний и умений, полученных на курсе Быстрый старт в профессию.
Новым для меня стала работа с регистром бухгалтерии и регистром расчета. Помимо этого, полезным было также освещение некоторых интересных
моментов, например, приоритеты операций в выражениях, преобразование различных типов к строке. Закрепились некоторые знания, полученные
в курсе Быстрый старт в профессию. 1с-программированием раньше не занимался, начал изучать в связи с желанием сменить род деятельности.
После освоения курсов уже написал пару полезных обработок по работе. Дистанционный формат работы оказался очень удобен для меня,
т.к. я являюсь достаточно занятым человеком. Еще одним плюсом является возможность всегда вернуться к определенной теме, повторить,
переработать некоторый материал.
Шаг2.
!!!БАЗА клиентами и продажами
1) в обработке проведения покупки товаров не установлен флаг
Движения.ТоварыНаСкладе.Записывать = Истина;
2) Процедура ЗаполнитьКлиента с директивой наклиенте, надо насервере, т.к. получаетс справочники.Клиенты.ОсновнойПокупатель
3) Там же, ошибка Вместо Справочники.Клиенты.ОсновнойПокупатель Надо ОсновнойПоставщик
4) Документ Продажи Там идет вызов функции общего модуля, но в свойствах общего модуля не стоит галочки вызов сервера – поставил
5) Не выбран регистр накопления для движений для докумена ПРодажи, хотя движения есть – поставил галочку
6) В запросе нужно указать левое соединение, т.к. некоторого товара может не быть в регистрах накопления, выбрать также номерстроки
в табличной части для дальнейшего указания строки для ошибки, для полей из регистра надо добавить условие Isnull(, 0)
7) Проблема с проведением документа Продажи. Выбран контроль проведения до записи документа, контроль на актуальный момент времени.
Нужно очищать движения перед запросом Движения.ТоварыНаСкладе.Записать()
8) Далее в сообщении о Недостачи товара вместо Сообщение.Поле = “Товары.Количество” надо
Сообщение.Поле = “Товары[” + ВыборкаТовары.НомерСтроки + “].Количество”
9) Если недостача, надо отказу присвоить Истина и выполнить после сообщений возврат из процедуры проведения.
10) для точности вместо Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество
надо сначала умножать, потом делить Запись.Сумма = ВыборкаТовары.СумОст*Запись.Количество/ВыборкаТовары.КолОст;
ВыборкаТовары.КолОст можно не проверять на равенство 0, т.к. до этого мы выполнили проверку количества.
11) Надо для документа ПРодажи для поля Серия в ТЧ Товары сделать связь параметро выбора с владельцем по полю товар
Соответственно надо очищать предыдущие движения до запроса.
!!!БАЗА С ЖИВОТНЫМИ
1) Документ Поступление Поле ИсточникПоступления может быть пустым. Необходимо в свойствах реквизита формы или документа выставить свойство
ПроверкаЗаполнения в Выдавать Ошибку
2) Документ ВыбытиеЖивотных не открывается в тонком клиенте, причина – доступ к константе в процедуре приОткрытии, который возможен
только на сервере, переделал.
3) В модуле объекта документа выбытиеЖивотных в процедуре ОбработкаЗаполнения по ветке иначе данные заполнения заполняются датой19800101
и создается новая структура. Закоментировал эту ветку, т.к. она очищала данныезаполнения в случае интерактивного ввода нового из списка
с включенным отбором либо вызовом метода Заполнить. Т.о. стандартная обработка не работала бы.
4) В обработке проведения выбитиеЖивотных ошибка в запросе на проверку остатков, во-первых, там выбираются данные табличной части документа
и не накладывается условие по ссылке, во-вторых там используется внутреннее соединение, тогда как нужно правое, т.к. нулевые остатки товара
не хранятся.
5) В обработке проведения ВыбытиеЖивотных записываются движения и проверяется остаток животных на момент времени документа, не включая
границу. Исправил.
6) Ссылка на поле – Сообщение.Поле берется по номеру строки, а надо вычитать 1, т.к. там используется индекс, а не номер
7) в Форме документа выбытиеЖивотных необходимо на реквизит направление поставить свойство проверки заполнения – выдавать ошибку
8) Из регистра ВыбытияЖивотных животные только выбывают, соответственно вид у регистра надо поставить обороты вместо остатки
9) у реквизитов количество и количествофакт документа Инвентаризация нужно убрать проверку заполнения, т.к. по плану может числиться определенное количество
а по факту быть нулевым и наоборот.
10) В обработке проведения документа перемещения товара после записи движений в запросе для проверки остатков не указали условие
что остаток должен быть < 0 "РазмещениеЖивотныхОстатки.КоличествоОстаток < 0"
11) в отчете размещениеЖивотных нужно к периоду добавлять 1 секунду, т.к. остатки берутся исключая границу.
Шаг3
Так как я сам по сути начинающий программист, помог разобраться в некоторых вопросах новичкам на форуме, ник grigoriy-1c
http://www.forum.mista.ru/topic.php?id=742310
http://www.forum.mista.ru/topic.php?id=742305
http://www.forum.mista.ru/topic.php?id=742231
Григорий, благодарим вас за обратную связь по курсу.
>в документе указано задание по базе с животными, база совсем другая
В документе указана база компании, занимающейся оптовой торговлей. Возможно базу уже заменили.
>(P.S. Это персональные данные, вы должны автоматом определять
Естественно мы идентифицируем участника по его аккаунту. Иначе было бы невозможно определить отчитались ли вы по предыдущим заданиям. Указание ФИО – простая формальность, которая облегчит жизнь сотруднику, создающему страницу с финалистами.
Финальное задание принято, поздравляем с успешным окончанием базового курса!
Спасибо за поздравление)
Да, документ задания поменяли :) Был документ с заданием базы с животными.