Базовый курс. Финальное задание 21-го потока

Объявляем начало финала 21-го потока базового курса по программированию.

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

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

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

комментариев 12 на “Базовый курс. Финальное задание 21-го потока”

  1. Шаг 1.

    Что нового? Два последних блока полностью, они оказались и самыми трудные для меня.

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

    Применял ли новые навыки? Пока нет, но надеюсь, что все чему я научился на ваших курсах, мне пригодится. Планирую и дальше продолжить учебу.

    Что было неожиданным? Пожалуй, сложность домашних заданий, но именно благодаря им приходило понимание материала.

    Фармат? Для меня оптимальный.

    Большое спасибо авторам курсов и всей вашей команде.

    Алисов Игорь.
    г.Железнодорожный, Московская обл.

    Шаг 2.

    1) Документ ПокупкаТоваров.

    – Тип реквизита Количество изменить на число 15.3

    – Команда “Заполнить клиента”.

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
        Объект.Клиент = ОсновнойПоставщик();
    КонецПроцедуры


    &НаСервереБезКонтекста
    Функция ОсновнойПоставщик()
        Возврат Справочники.Клиенты.ОсновнойПоставщик;   
    КонецФункции

    – Команда “Заполнить товары”

    &НаКлиенте
    Процедура ЗаполнитьТовары(Команда)
       
        Перем Основание;
        ВвестиЗначение(Основание, "Выберите документ-основание", ТипЗнч(Объект.Ссылка));
        Если НЕ Основание.Пустая() Тогда
            ЗаполнитьТоварыНаСервере(Объект.Ссылка, Основание);
        КонецЕсли;
       
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ТекущийДокумент, ДокументОснование)

        Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());

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

    – процедура ОбработкаПроведения:
    добавил

    Движения.ТоварыНаСкладе.Записывать = Истина;

    2) Документ ПродажаТоваров.

    – Команда “Проверка документа”.

    В том виде как она сейчас есть смысла не имеет, т.к. реквизит Количество не может принимать отрицательные значения, система просто не дает их вводить. Но даже если предположить, что Количество может быть отрицательным и убрать соответствующую галочку в его свойствах, то все равно процедура проверки работать не будет, т.к. документ еще не записан и в базе нет последних изменений. Поэтому, чтобы реализовать подобную проверку, надо делать ее на клиенте и работать надо с элементами формы, ее табличной частью.
    Т.о. галочку оставляем, команду убираем, потому что непонятно что проверять. А значит и модуль ПроверкаДокументовСервер можно удалить.

    – Процедура ОбработкаПроведения.

    Лучше, конечно, использвать другой способ проверки остатков (сначало сделать запись движений, затем выполнить запрос, проверку, далее отказ или запись), но попробуем отладить то, что есть.
    Итак, предполагается что запись движение можно делать и в случае отрицательных остатков, но надо предупредить об этом пользователя.

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

    2. В запрос надо добавить условие

        |ГДЕ
        |   ПродажаТоваровТовары.Ссылка = &Ссылка";

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

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

    Процедура проверки:

    Процедура ПроверитьДокумент(Ссылка) Экспорт
       
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   ПродажаТоваровТовары.Количество КАК КолДок,
            |   ТоварыНаСкладеОстатки.КоличествоОстаток КАК КолОст,
            |   ПродажаТоваровТовары.Товар,
            |   ПродажаТоваровТовары.Серия
            |ИЗ
            |   Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
            |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
            |               ,
            |               Товар В
            |                   (ВЫБРАТЬ
            |                       ПродажаТоваровТовары.Товар
            |                   ИЗ
            |                       Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
            |                   ГДЕ
            |                       ПродажаТоваровТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладеОстатки
            |       ПО ПродажаТоваровТовары.Товар = ТоварыНаСкладеОстатки.Товар
            |           И ПродажаТоваровТовары.Серия = ТоварыНаСкладеОстатки.Серия
            |ГДЕ
            |   ПродажаТоваровТовары.Ссылка = &Ссылка";


        Запрос.УстановитьПараметр("Ссылка", Ссылка);   
        Результат = Запрос.Выполнить();

        ВыборкаТовары = Результат.Выбрать();

        Пока ВыборкаТовары.Следующий() Цикл
           
            Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
            Если Недостача>0 Тогда
               
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" серии "+ВыборкаТовары.Серия+" в количестве "+Недостача;
                Сообщение.Сообщить();
           
            КонецЕсли;
           
        КонецЦикла;
       
    КонецПроцедуры

    Процедура проведения:

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

        Запрос.УстановитьПараметр("Ссылка", Ссылка);   
        Результат = Запрос.Выполнить();

        ВыборкаТовары = Результат.Выбрать();

        Пока ВыборкаТовары.Следующий() Цикл
           
            Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
            Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
            Запись.Период = Дата;
            Запись.Товар = ВыборкаТовары.Товар;
            Запись.Серия = ВыборкаТовары.Серия;
            Запись.Количество = ВыборкаТовары.КолДок;
            Если ВыборкаТовары.КолОст = 0 Тогда
                Запись.Сумма = ВыборкаТовары.СумДок;
            Иначе
                Запись.Сумма = ВыборкаТовары.СумОст*Запись.Количество/ВыборкаТовары.КолОст;
            КонецЕсли;
           
        КонецЦикла;
       
    КонецПроцедуры

    – При выборе серии нет отбора по выбранному товару.
    Для реквизита Серия установить свойство “Связи параметров выбора” в значение “Отбор.Владелец(ТоварыюТовар)”.

    Шаг 3.
    Провел мини-семинар по теме “Возможности настройки отчетов в ползовательском режиме”.

    1

    • Dobrenko Oleg 29.08.2013 в 13:30

      Игорь, благодарим за отзыв!
      Финальное задание принято. Поздравляем с успешным окончанием базового курса!

  2. Алексей Новиков 27.08.2013 в 16:23

    Шаг 1
    Базовый курс для начинающего с нуля программиста, кем я и являюсь, безусловно, очень важен, т.к. создает правильную платформу знаний. Основываясь на ней, можно дальше развивать навык программирования, углубляя понимание и получая опыт уже в прикладных направлениях. Сам подход к обучению очень вдохновил! Четкий график обучения, ясная разбивка тем, изложение от простого к сложному, важнейший момент домашних заданий, – всё это перевернуло мое представление о том, каким образом можно эффективно повышать квалификацию, что крайне важно для специалиста.
    В начале, было совершенно не понятно, каким образом решать прикладные задачи на платформе 1С. Изучал книги, форумы, – это не дало целостного представления, требовало колоссального количества времени, но после систематического прохождения базового курса, стала вырисовываться ясная картина, да и справочная литература стала понятной.
    Сроки горят: требуется написать две конфигурации с нуля, и поддерживать готовую, но теперь мне не страшно, уверен, что, благодаря Вам справлюсь.
    Формат обучения очень удобен, но мне, как начинающему, довольно сложно было сразу вникнуть в смысл принципов работы платформы, особенно когда дело дошло 3 и 4 блоков. Уроки – очень ёмкие по содержанию, насыщенны знанием, и требуется время, чтоб их осознать.
    От всего сердца благодарю организаторов этого замечательного курса, через некоторое время планирую продолжить обучение на продвинутом курсе.
    Новиков Алексей Юрьевич, город Тула. IT-специалист Агентства Недвижимости «Ваш Дом».
    Шаг 2
    1. При отладке приложения ошибка. В команде Заполнить Клиента из модуля формы документа ПокупкаТоваров, происходит обращение из модуля клиента к предопределенному значению справочника, которое находится на сервере. Для корректной работы нужно вызвать серверную функцию

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
         Объект.Клиент = ПолучитьКлиента();
    КонецПроцедуры
    &НаСервереБезКонтекста
    Функция ПолучитьКлиента()
    Возврат Справочники.Клиенты.ОсновнойПоставщик;
    КонецФункции // ПолучитьКлиента()

    2. Команда ЗаполнитьТовары .В функции ВвестиЗначние, некорректно указан Тип, требуется ДокументСсылка:

    ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));

    3. Команда ЗаполнитьТовары. Функция ВвестиЗначение уже возвращает Истину или Ложь в зависимости от выбора, поэтому проверка на выбранное значение правильно выглядит так:

         Если ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров")) Тогда
              ЗаполнитьТоварыНаСервере(Основание);
         КонецЕсли;

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

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

    5. Документ ПродажаТоваров, Команда ПроверкаДокумента. Возникает вопрос: Нужно ли делать проверку табличной части документа на отрицательное количество, если у реквизита табличной части проставлено свойство “неотрицательный”. Быть может, в документе ПродажаТоваров возможны отрицательные значения по количеству (например возврат товара), тогда на них можно просто указать с помощью СообщенияПользователю с указанием на строку в табличной части. Запрос не нужен, так как он возвращает уже записанные данные в базу.

    &НаКлиенте
    Процедура ПроверкаДокумента(Команда)
         Для каждого Строка Из Объект.Товары Цикл
              Если Строка.Количество <= 0 Тогда
        Сообщение = Новый СообщениеПользователю;
           Сообщение.Текст = "Ошибка в строке № "+Строка.НомерСтроки+" количество не может быть отрицательным!";
           Сообщение.Поле = "Объект.Товары[Строка.НомерСтроки - 1].Количество";
           Сообщение.УстановитьДанные(Объект.Товары);
           Сообщение.Сообщить();
         КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    В этом случае, так же нужно убрать свойство “Неотрецательное” реквизита Количество.
    6. Документ ПродажаТоваров. При выборе серии в табличной части удобно сделать связь параметров выбора по Владельцу в свойстве реквизита “Серия”.
    7. В свойствах документа ПродажаТоваров нужно поставить галку на регистр ТоварыНаСкладе в Движениях.
    8. ОбработкаПроведения документа ПродажаТовара. Заменить результат запроса типа NULL на 0:

    ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
    ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст

    9. Требуется указать левое соединение табличной части документа и регистра по полям Товар и Серия.
    10. Также в запросе нужно сгруппировать товар по количеству.
    11. В свойствах таблицы Остатки регистра накоплений следует указать параметр период, в который следует передать границу по моменту времени документа:

            Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
             Запрос.УстановитьПараметр("Период", Граница);

    12. Более корректно явно указать на строку табличной части, где не хватает нужного количества товара:

              Если Недостача>0 Тогда
                   СтрокаП = Товары.Найти(ВыборкаТовары.Товар, "Товар");
                   Индекс = Товары.Индекс(СтрокаП);
                   Сообщение = Новый СообщениеПользователю;
                   Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
                   Сообщение.Поле = "Товары[Индекс].Количество";
                   Сообщение.УстановитьДанные(ЭтотОбъект);
                   Сообщение.Сообщить();
                   Отказ = Истина;
              КонецЕсли;

    13. Важно включить проверку деления на ноль:

              Если ВыборкаТовары.КолОст = 0 Тогда
                   Запись.Сумма = 0
              Иначе
                   Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
              КонецЕсли;

    14. Реквизит “Количество” табличной части Товары документа ПокупкаТоваров имеет тип Строка, нужно заменить на Число (15,3)
    15. Выполним просьбу главбуха: в свойствах стандартных реквизитов справочника “Серии”, установить проверку заполнения – выдавать ошибку для реквизита “Код”.
    16. В качестве дополнения, можно добавить проверку на срок годности Серии продукта: если просрочен, то документ не проводить:

              Если ВыборкаТовары.СрокГодности < ТекущаяДата() Тогда
                   СтрокаП = Товары.Найти(ВыборкаТовары.Товар, "Товар");
                   Индекс = Товары.Индекс(СтрокаП);
                   Сообщение = Новый СообщениеПользователю;
                   Сообщение.Текст = "Серия товара просрочена "+ВыборкаТовары.Товар;
                   Сообщение.Поле = "Товары[Индекс].Товар";
                   Сообщение.УстановитьДанные(ЭтотОбъект);
                   Сообщение.Сообщить();
                   Отказ = Истина;
              КонецЕсли;

    Шаг 3
    Буквально час назад провел семинар на тему: “Обзор основных возможностей платформы 1С:Предприятия 8.2”. Фото-отчет:
    http://www.image-share.com/upload/2262/219.jpg
    http://www.image-share.com/upload/2262/220.jpg

    • Dobrenko Oleg 28.08.2013 в 18:04

      Алексей, благодарим за отзыв!
      Финальное задание принято, поздравляем, вы в списке финалистов!

  3. Шаг №1

    Карсакова Инна Александровна. Город Воронеж.

    Узнала очень много нового. Особенно была интересна работа с СКД, регистрами бухгалтерии, расчета. И вообще много всяких деталей, которые наедине с учебником очень трудно разобрать и понять.
    Раньше возникали большие затруднения по поводу того, что с чем взаимодействует. Как правильно обращаться к каким-либо элементам. Сейчас как бы нарисовалась общая картинка программы..)))
    Формат обучения просто супер…))) Можно сколько надо перематывать обратно. Слушать более проблемные моменты.
    Огромное спасибо Е. Гилеву. Очень понятно объясняет и интересно!!!

    Шаг №2

    1. В документе ПродажаТоваров не указан регистр ТоварыНаСкладе.

    2. При создании документа ПокупкаТоваров выскакивает ошибка: “Не определена переменная Справочники”. Причина ошибки – происходит обращение с клиента к предопределенному элементу справочника.

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
    //Объект.Клиент = Справочники.Клиенты.ОсновнойПокупатель;

    Объект.Клиент = ПолучитьКлиента();

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

    &НаСервереБезКонтекста
    Функция ПолучитьКлиента()

    Возврат Справочники.Клиенты.ОсновнойПоставщик;

    КонецФункции // ПолучитьКлиента()

    3. И предопределенный элемент справочника надо выбирать – ОсновнойПоставщик, так как фирма покупает товары в документе ПокупкаТоваров.

    4. Чтобы конфигурация работала в Тонком и Толстом клиентах: Сервис -> Параметры -> Управляемое приложение и обычное приложение.

    5. При нажатии кнопки ЗаполнитьТовары в документе ПокупкаТоваров ошибка: “Тип не определен (Документ.ПокупкаТоваров)”. Вместо Документ надо указать ДокументСсылка.

    ВвестиЗначение(Основание, “Выберите документ-основание”, Тип(“ДокументСсылка.ПокупкаТоваров”));

    6. Добавила проверку:

    Если ЗначениеЗаполнено(Основание)И НЕ Основание.Пустая() Тогда

    ЗаполнитьТоварыНаСервере(Основание);

    ИначеЕсли НЕ ЗначениеЗаполнено(Основание) Тогда

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Документ-основание не выбран!!!”;
    Сообщение.Сообщить();

    КонецЕсли;

    7. В документе ПокупкаТоваров при выборе документа-основания возникает ошибка: “Ошибка при вызове метода контекста (ПолучитьОбъект)
    Объект = ТекущийДокумент.ПолучитьОбъект();
    по причине:
    Элемент не выбран!”

    Исправила:

    ЗаполнитьТоварыНаСервере(Основание);

    //&НаСервереБезКонтекста
    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)

    //Объект = ТекущийДокумент.ПолучитьОбъект();
    //Объект.Товары.Загрузить(ДокументОснование.Товары);
    //

    Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());

    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    8. При создании документа ПродажаТоваров возникает ошибка: “Переменная не определена (ПроверкаДокументовСервер)”.

    В свойствах ОбщегоМодуля установила флажок “ВызовСервера”.

    9. Так же возникает ошибка “Процедура или функция с указанным именем не определена (Предупреждение)”.

    Причина: ОбщийМодуль исполняется на сервере, а Предупреждение может использоваться только в Тонком, Толстом и Веб-клиенте.
    Вместо этого можно использовать СообщениеПользователю:

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Ошибка в строке № “+Выборка.НомерСтроки+”. Количество не может быть отрицательным!”;
    Сообщение.Сообщить();

    10. Проверка ОбщегоМодуля на отрицательные строки в документе не нужна, так как у реквизита Количество установлен флажок “Неотрицательное”.

    11. В справочнике Серии указала Тип кода: Строка.

    12. В ОбработкеПроведения документа ПокупкаТоваров добавила:

    Движения.ТоварыНаСкладе.Записывать = Истина;

    13. В документе ПокупкаТоваров изменила тип реквизита Количество на Число 15.3, неотрицательное.
    14. В регистре ТоварыНаСкладе исправила точность реквизита Количество на 3.
    15. На рабочий стол в раздел “См. также” вывела регистр ТоварыНаСкладе.

    16. Сделала обязательным поле “НомерСерии”. НомерСерии – это поле код. Код является стандартным реквизитом. Нажимаем кнопку СтандартныеРеквизиты. Открываем окно свойств поля код. Свойство ПроверкаЗаполнения-> Выдавать ошибку.

    17. В документе ПродажаТоваров при условии, что Недостача >0, добавила:

    Отказ = Истина;

    18. В документе ПродажаТоваров добавила параметр Момент:

    Граница = Новый Граница (МоментВремени(), ВидГраницы.Включая);

    Запрос.УстановитьПараметр(“Момент”, Граница);

    19. Сделала, чтобы сообщение было привязано к конкретной строке:

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Недостаточно товара “+ВыборкаТовары.Товар+” в количестве “+Недостача;
    //Сообщение.Поле = “Товары.Количество”;
    Сообщение.Поле = “Товары[“+(ВыборкаТовары.НомерСтроки-1)+”].Количество”;

    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();

    20. В запрос вставила проверку:

    | ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
    | ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст

    21. ВНУТРЕННЕЕ СОЕДИНЕНИЕ изменила на ЛЕВОЕ. Так как нам нужны все строки по документу.

    22. В документе ПродажаТоваров у реквизита Серия настроила свойство “Связи параметров выбора” по владельцу.

    Шаг №3

    Был проведен мини-семинар на тему “Система компановки данных, модификация отчетов”. Фото на mg@spec8.ru.

    • Dobrenko Oleg 27.08.2013 в 15:23

      Инна, благодарим за отзыв!
      Фото получили, финальное задание принято.
      Поздравляем, вы вы финалист 21 потока базового курса по программированию!

  4. Александр 26.08.2013 в 16:52

    1. Обратная связь по пройденному курсу.

    Я работаю системным администратором в торговой компании,
    другого специалиста по программам 1С пока нет поэтому нужно
    повышать квалификацию.
    У нас эксплуатируется сейчас конфигурация 1С Торговля Склад,
    куплена Торговля 10.3, бухгалтерия использует конфигурацию
    Бухгалтерия 2.0.
    Нового для меня в Базовом курсе очень много, кроме возможно
    блока 0 и 1. Материал курса излагается достаточно подробно,
    начиная с основных определений без которых невозможно понять
    более сложные механизмы.
    Самое главное заблуждение от которого я избавился в процессе
    изучения курса – это то что можно освоить программирование на
    языке 1С быстро, например за несколько недель. Учитывая большую
    функциональность конфигураций обучение занимает довольно много
    времени. Я собираюсь в дальнейшем пройти и Продвинутый курс.
    На работе программировать пока приходилось немного, добавил
    новый документ в бухгалтерию, сдалал внешнюю печатную форму,
    настроил обмен данными. Но результат от обучения конечно уже
    есть, открываешь конфигуратор и видишь знакомые объкты, смотришь
    модули и понимаешь как работает программа.
    Формат курсов для меня идеальный т.к. приходится совмещать учебу
    с работой. Содержание курса и методика преподавания разрабатывались
    талантливыми преподавателями.
    Очные курсы в ЦСО 1С проходят три полных дня на
    каждый раздел курса. Понятно , что во время обучения разобраться
    во всех вопросах невозможно и требуется большая самостоятельная
    работа, причем полученная методичка не помогает.
    О себе:
    Барбитов Александр Владимирович
    г.Санкт-Петербург, Системный администратор, ООО “Петропром”.

    2. Исправленные ошибки в конфигурации :

    1. В документе Поступление товаров в обработчике действия команды
    “Заполнить товары” исправил тип на ДокументСсылка :

    Выбор = ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));

    2. В этом же обработчике в серверной процедуре ЗаполнитьТоварыНаСервере
    исправил ошибку в параметре метода загрузить:

     ТЗ = ДокументОснование.Товары.Выгрузить();
        Объект.Товары.Загрузить(ТЗ);

    Необходимо сначала выгрузить табличную часть в таблицу значений.
    3. Там же добавил серверную функцию :

    Функция ЗаполнитьКлиентаНаСервере()

    Возврат Справочники.Клиенты.ОсновнойПоставщик;   

    КонецФункции

    и ее вызов Объект.Клиент = ЗаполнитьКлиентаНаСервере();
    т.к. свойство глобального контекста Справочники не доступно на клиенте.
    4. Изменил имя предопределенного элемента ОсновнойПокупатель на ОсновнойПоставщик
    в соответствии со значением в справочнике.
    5. В обработке проведения документа Поступление Товаров добавил строку :

    Движения.ТоварыНаСкладе.Записывать = Истина;

    6. В окне редактирования объекта Документ Продажа Товаров на закладке движения
    ометил флажком регистр накопления ТоварыНаСкладе, т.к. документ не формировал движений
    по регистру.
    7. Для реквизита Серии табличной части документа Продажа Товаров установил
    Свойство связи параметров выбора Отбор.Владелец(Товары.Товар). Для того чтобы
    выбирать серии соответствующие выбранному товару.
    8. В запросе в обработк проведения установил условие по ссылке на текущий документ
    т.к. выбирались данные из нескольких документов.
    9. Там же перед выполнением запроса добавил строки :

    Движения.ТоварыНаСкладе.Очистить();
        Движения.ТоварыНаСкладе.Записать();

    ,
    для очиски записей при перепроведении документа.
    10. Была неверная привязка сообщения пользователю к номеру строки документа,
    изменил строку на следующую :

    Сообщение.Поле = "Товары["+(ВыборкаТовары.НомерСтроки-1)+"].Количество";

    предварительно добавив в запрос выбор поля номер строки табличной части.
    11. Документ проводился даже при нехватке товара. Чтобы этого не происходило добавил
    установку параметра Отказ в Истину.

    Отказ = Истина;

    12. Если товар не закупался, т.е. нет движения по регистру, то в результат запроса он
    не попадает из-за того что используется внутреннее соединение таблиц. Установил левое
    соединение выбрав все поля из таблицы табличной части документа.
    13. Т.к. в выборку могут попадать значения NULL изменил два поля :

    |   ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
          | ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст,

    14. При расчете себестоимости изменил порядок операций /* на*/, для большей точности результата.
    15. Чтобы избежать деления на ноль добавил условие :

    Если ВыборкаТовары.КолОст=0 Тогда
           
            Запись.Сумма = 0;   
            Иначе
             
            Запись.Сумма = ВыборкаТовары.СумОст*Запись.Количество/ВыборкаТовары.КолОст;
            КонецЕсли;

    16.В свойствах общего модуля ПроверкаДокументовСервер установил галочку Вызов сервера.
    17. Проверка корректости заполнения документа Продажа Товаров ничего не выдает,
    т.к. реквизит табличной части Количество число Неотрицательное (см.свойства реквизита).

    Для того чтобы поле Номер серии сделать обязательным для заполнения в модуле объекта в обработчик
    события ПередЗаписью Справочника Серии добавил следующий код:

    Процедура ПередЗаписью(Отказ)
        Если Код = 0 Тогда
       
            Отказ = Истина;
            Сообщить("Запоните номер серии !");
       
        КонецЕсли;
    КонецПроцедуры

    3. Статья на сайте infostart.ru – http://infostart.ru/public/198784/

    • Dobrenko Oleg 27.08.2013 в 15:11

      Александр, благодарим за отзыв!
      >можно освоить программирование на языке 1С быстро, например за несколько недель.
      Да, если бы было всё так просто… :)
      Поздравляем с успешным завершением базового курса по программированию!

  5. Ольга 26.08.2013 в 13:16

    Шаг 1
    Суркова Ольга Николаевна, эксперт по разработке программного обеспечения, ООО «Центр информационных технологий» г.Стрежевой, Томская область.
    Из базового курса по программированию я узнала очень много, почерпнула много нужной и полезной информации, необходимой для работы в программе «1С:Предприятии 8». Научилась работать с формами, с запросами, СКД, с регистрами, планами счетов, поняла принцип расчета зарплаты и работы бухгалтерии на версии 8.2. Самое главное – я стала понимать эту программу.
    С 1998 года я работала на 1С версии 6.0, затем 7.5, 7.7. Когда предприятие, которое я обслуживаю, решило перейти на версию 8, я решила перейти на изучение новой версии. Ездила на очные двухнедельные курсы по версии 8.1, пыталась по многочисленным книжкам изучить работу на этой платформе, но понимание этой программы не приходило, к тому же я продолжала работать на версии 7.7 и постоянно отвлекалась, то есть не было полного погружения. Запросы для меня были вообще «тёмным лесом». Тогда я решила, что платформа 8 – неудачная, медленная, непонятная для обычного программиста, очень неудобная. Теперь-то я понимаю, что заблуждалась! Теперь мне эта программа нравится, понимаю, насколько она может быть гибкой и удобной в руках опытных специалистов. Моё предприятие уже работает на версии 8.2, я уже делаю различные изменения в отчётах, печатных формах, добавляю реквизиты и вывожу их на форму. Недавно создала обработку, работающую в фоновом режиме, анализирующую данные по документам и регистрам и рассылающую уведомления пользователям по электронной почте. Теперь у меня есть более чёткое понимание, что можно, а что нельзя, знаю возможности этой программы (хоть ещё далеко не все). Понимаю, что предстоит ещё много чего узнать и научиться. Начала изучение программы «1С: ЗУП», хотелось бы изучить возможности конвертации данных и конечно же, продолжить изучение продвинутого курса.
    Видеоформат обучения очень удобен! Очные курсы не дают полного понимания программы и необходимого умения работать в программе, не хватает практики, весь поток информации не усваивается, в голове остаётся не более 25% информации. Но и у видеокурсов есть маленький недостаток – очень уж долго проходит обучение. Огромный плюс в том, что можно прослушать лекцию в любой момент, когда есть время, можно повторить урок, если что-то непонятно. Большое удовольствие доставляет просмотр решений автора, который находит более правильные и более универсальные решения к поставленным задачам.
    Огромное спасибо автору за полученные знания!

    Шаг 2
    1. Неверно указан тип реквизита «Количество» в табличной части документа «ПокупкаТоваров». В свойствах указан тип «Строка», 10. Необходимо задать тип «Число» 15.3.

    2. У документа «ПродажаТоваров» на закладке «Движения» не отмечен регистр накопления «ТоварыНаСкладе», хотя в модуле объекта есть обращение к этому регистру. Поэтому необходимо указать данный регистр для реализации движений документа.

    3. В модуле формы документа «ПродажаТоваров» выдаётся ошибка при обращении к серверной процедуре общего модуля «ПроверкаДокументовСервер». В свойствах этого модуля галочкой отмечаю вызов сервера.

    4. В регистре накопления «ТоварыНаСкладе» неверно указана точность числа – в свойствах ресурса «Количество» указан тип «Число» 15.2, а нужно указать 15.3.

    5. В модуле документа «ПокупкаТоваров» производится обращение к базе данных из клиентской процедуры. Создаю функцию на сервере и обращаюсь из клиентской процедуры к этой функции:

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
        Объект.Клиент = ПолучитьОсновногоКлиента();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Функция ПолучитьОсновногоКлиента()
        Возврат Справочники.Клиенты.ОсновнойПокупатель;
    КонецФункции

    6. В модуле документа «ПокупкаТоваров» производится обращение к предопределённому элементу справочника клиентов к основному покупателю. Но предопределённого элемента «ОсновнойПокупатель» нет, к тому же закупка обычно производится у основного поставщика. Такой элемент есть, поэтому в модуле документа указываю обращение к предопределённому элементу «Справочники.Клиенты.ОсновнойПоставщик».

    7. В общем модуле «ПроверкаДокументовСервер» есть обращение к системной команде «Предупреждение», хотя эта команда не может быть вызвана из серверной процедуры. А команда «Сообщить» может быть вызвана с сервера. Поэтому заменяю команду «Предупреждение» на команду «Сообщить» и убираю таймер.

    8. На панель навигации не выведен регистр «ТоварыНаСкладе». Вызываю настройку панели навигации, регистр переношу в пункт «См.также», а также для удобства переношу все документы в пункт «Важное».

    9. При проведении документа «ПокупкаТоваров», не происходит запись в регистр накопления. В процедуру обработки проведения добавляю команду: «Движения.ТоварыНаСкладе.Записывать=Истина;»

    10. В документе «ПокупкаТоваров» при вызове команды «ЗаполнитьТовары», выдаются ошибки. Исправляю тип значения при вызове команды «Ввести Значение»: «Тип(“ДокументСсылка.ПокупкаТоваров”)». Если при вызове диалогового окна отказаться от выбора, то выдаётся ошибка в условии: «НЕ Основание.Пустая()». Добавляю к этому условию ещё одно условие, проверяющее, заполнено ли вообще значение «Основание»: «Если ЗначениеЗаполнено(Основание) И НЕ Основание.Пустая()». Убираю строку: «Объект = ТекущийДокумент.ПолучитьОбъект();».

    &НаКлиенте
    Процедура ЗаполнитьТовары(Команда)
        Перем Основание;
        ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
        Если ЗначениеЗаполнено(Основание) И НЕ Основание.Пустая() Тогда
            ЗаполнитьТоварыНаСервере(Основание);
        КонецЕсли;
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
        Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
    КонецПроцедуры

    11. В документе «ПродажаТоваров», при выборе серии товара, высвечивается полный список серий, хотя должны высвечиваться только серии, подчинённые данному товару. Для устранения недоработки, в свойствах поля «Серия», в связях параметров выбора, указываю отбор по владельцу: «Отбор.Владелец(Товары.Товар)».

    12. Не совсем понятно, для чего создана команда «ПроверкаДокумента» в документе «ПродажаТоваров». Процедура проверяет наличие в документе строк с отрицательным количеством. Но ведь в свойстве реквизита «Количество» уже указано, что этот реквизит не может быть отрицательным! Так что данная команда является лишней.

    13. При проведении документа «ПродажаТоваров» неверно указывается количество недостачи товара. На параметры регистра остатков необходимо установить момент времени и задать этот параметр: «Запрос.УстановитьПараметр(“Момент”,Новый граница(МоментВремени(),ВидГраницы.Включая))». А также в запросе необходимо указать не внутреннее соединение таблиц, а левое соединение по табличной части документа, так как для проведения документа необходимо анализировать все строки табличной части документа, а не только те, по которым есть остатки. Ещё необходимо проверить количество и сумму из регистра на значение Null: «isnull(ТоварыНаСкладеОстатки.СуммаОстаток,0)». И при записи суммы в регистр, необходимо проверить делитель на 0: «Запись.Сумма = ?(ВыборкаТовары.КолОст0, ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество, 0);» . Перед проведением необходимо очищать все предыдущие движения по данному документу, поэтому добавляю команду «Движения.ТоварыНаСкладе.Очистить();». В случае появления недостачи, желательно отказаться от проведения и написать команду «Отказ = Истина;». Диагностическое окно об ошибке выводится в произвольном месте, а должно быть привязано к строке табличной части документа. Для этого в запрос вывожу номер строки документа: «ПродажаТоваровТовары.НомерСтроки», а в поле сообщения указываю: «Сообщение.Поле = “Товары[“+(ВыборкаТовары.НомерСтроки-1)+”].Количество”;».

    14. Для удовлетворения просьбы главного бухгалтера, необходимо в свойстве реквизита указать необходимость заполнения поля. Так как номер серии задаётся в поле «Код», на закладке «Данные» справочника «Серии» вызываю «Стандартные реквизиты», вызываю свойства поля «Код», в проверке заполнения устанавливаю «Выдавать ошибку».

    Шаг 3
    Провела минисеминар по теме «Горячие клавиши при работе в конфигураторе 1С, работа с шаблонами и прочие удобные полезности». Так как в нашем отделе работают в основном программисты 1С, данная тема очень полезна в дальнейшей работе.

    1

    2

    • Dobrenko Oleg 26.08.2013 в 14:06

      Ольга, благодарим за развернутый отзыв по курсу!
      Практическое задание принято. Поздравляем с завершением базового курса по программированию, успехов в дальнейшем обучении!

  6. Сергей 22.08.2013 в 21:52

    Шаг 1.
    1. Что нового Вы узнали из базового курса по программированию?
    Все новое. Кроме модуля 1 и нулевого.
    2. От каких заблуждений избавились?
    Сложно сказать. Взгляд изменился.
    3. Если Вы работаете на практике с платформой «1С:Предприятие 8», то, каким образом
    вам удалось применить новые навыки (какие результаты были достигнуты);
    Ну, переписал более оптимальнее пару своих модулей.
    4. Если Вы пока не работаете реальных проектах по внедрению решений на
    «1С:Предприятии 8», то, что оказалось неожиданным из материалов курса?
    Модуль 4. Очень сложный и не понятны. До сих пор не понял корректно его.
    5. Насколько удобен, оказался формат обучения в сравнении с очным форматом?
    Просто супер! Сидишь, пьешь чай, ешь печеньки и учишься. –супер!

    ФИО – Самусев Сергей Николаевич.
    Город- Самара.

    Шаг 2.

    1. Серия. Тип кода. Обычно везде берется Строка. Если код числом, то будет выглядеть так 4 555 строкой 3444.. так будет по шаблону.
    2. Сняты галочки на проверку уникальности, и автонумирация.
    3. Номер серии это стандартный реквизит код. Открываю стандартные реквизиты и там правой клавишей -> свойства. И там поле обязательно к заполнению.. значение – да(выдавать ошибку).
    4. Товары. Возможно короткое наименование.
    5. Док. Товары приход.. При движении в модуле объекта.. не было строки Движения.ТоварыНаСкладе.Записывать = Истина; Соответственно документ не записывался в регистр.
    6. Количество. – число 15,2, а не строка.
    7. Как должна рассчитываться сумма без цены? Тут не много не понятно. Но я бы добавил поле цена.
    8. Кнопка заполнить клиента.. работает на клиенте. Когда нужно делать обращение на сервере.
    9. Кнопка при заполнении основного клиента надо сменить с покупателя на поставщика предопределённое значение.
    10. Далее в этом же модуле есть процедура без контекста.. там мы получаем объект. Нам нужен контекст.
    11. При выборе товара не подставляется серия. Было бы неплохо делать автоматически.
    12. Если контрагент подставляется по умолчанию.. то бы еще от себя завел справочник, значения по умолчанию, где указываются значения по умолчанию.. а не предопределенные. Сегодня один поставщик основной, завтра другой.
    13. Далее нужно подправить сам код по кнопке заполнить товары..

    &НаКлиенте
    Процедура ЗаполнитьТовары(Команда)
       
        Перем Основание;
        Если ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров")) Тогда
            ЗаполнитьТоварыНаСервере(Объект.Ссылка, Основание);
        КонецЕсли;
       
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ТекущийДокумент, ДокументОснование)

        //Объект = ТекущийДокумент.ПолучитьОбъект();
        Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());

    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    14. Документ реализации. Серия, тут надо сделать отбор по владельцу.. а то прогружается все подряд.
    15. Также нужно добавить поле цена и автоматический пересчет.
    16. Документ вообще не делает движения. Нужно установить галочку на движение по регистру.
    17. По движению.. где ошибка была в запросе я не нашел.. пришлось переписать весь запрос, плюс, не было параметра отказ в истине, + не было позиционирование на строке с недостающим количеством. Корректный запрос ниже.

    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

        Движения.ТоварыНаСкладе.Записывать = Истина;
       
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   ПродажаТоваровТовары.Товар КАК Товар,
            |   ПродажаТоваровТовары.Серия,
            |   ПродажаТоваровТовары.Количество КАК КолДок,
            |   МАКСИМУМ(ПродажаТоваровТовары.НомерСтроки) КАК НомерСтроки
            |ПОМЕСТИТЬ ВТ
            |ИЗ
            |   Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
            |ГДЕ
            |   ПродажаТоваровТовары.Ссылка = &Ссылка
            |
            |СГРУППИРОВАТЬ ПО
            |   ПродажаТоваровТовары.Товар,
            |   ПродажаТоваровТовары.Серия,
            |   ПродажаТоваровТовары.Количество
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            |   ВТ.Товар,
            |   ВТ.Серия,
            |   ВТ.КолДок,
            |   ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
            |   ТоварыНаСкладеОстатки.СуммаОстаток КАК СумОст,
            |   ВТ.НомерСтроки
            |ИЗ
            |   ВТ КАК ВТ,
            |   РегистрНакопления.ТоварыНаСкладе.Остатки(
            |           ,
            |           Товар В
            |               (ВЫБРАТЬ
            |                   ВТ.Товар
            |               ИЗ
            |                   ВТ КАК ВТ)) КАК ТоварыНаСкладеОстатки";

        Запрос.УстановитьПараметр("Ссылка", Ссылка);   
        Результат = Запрос.Выполнить();

        ВыборкаТовары = Результат.Выбрать();

        Пока ВыборкаТовары.Следующий() Цикл
           
            Недостача = ВыборкаТовары.КолДок - ВыборкаТовары.КолОст;
            Если Недостача>0 Тогда
           
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
                Сообщение.Поле = "Товары[" + (ВыборкаТовары.НомерСтроки-1) + "].Количество";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
                Отказ = истина;
           
            КонецЕсли;
           
            Если Не Отказ тогда
                Запись = Движения.ТоварыНаСкладе.ДобавитьРасход();
                Запись.Период = Дата;
                Запись.Товар = ВыборкаТовары.Товар;
                Запись.Серия = ВыборкаТовары.Серия;
                Запись.Количество = ВыборкаТовары.КолДок;
                Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
            КонецЕсли;
        КонецЦикла;
       
    КонецПроцедуры

    18. Кнопка Проверка документа. Она делает через общий модуль. Я поставил галочку в общем модуле вызов сервера. + Ошибка в запросе, условие на 0, я сделал <= 0 , ну и вообще эта проверка не корректна в данном документе, т.к. – нельзя поставить в принципе. + предупреждение не работает на сервере. Я заменил на сообщить. И убрал второй параметра.

    Шаг 3.
    Не знаю подойдёт ли.. но я считаю.. что данные ответы, не смотря на то что я решил их сам.. это много что значит.. т.к. я структуру понял и разобрался в программировании.
    http://www.forum.mista.ru/topic.php?id=673500 – тут я грызлик.
    http://forum-1c.ru/index.php?topic=28878.msg86470#msg86470 – тут я boobzx
    http://forum-1c.ru/index.php?topic=31304.msg92156#msg92156 – boobzx
    http://forum-1c.ru/index.php?topic=31402.msg92404#msg92404 – ну и вот еще. Я думаю данных тем должно хватить. Т.к. Тут обхватывается не только знания и понимания по курсу.

    • Dobrenko Oleg 27.08.2013 в 14:58

      Сергей, благодарим за отзыв!
      Финальное задание принято. Поздравляем, вы в списке финалистов!