8.х Вопросы новичка по языку!

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

  1. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    доброго времени суток! решил освоить программирование 1с. и столкнулся с тем что никак нимогу вьехать в язык, ну нет прозрения и всё! надеюсь на вашу помощь!
    делаю примеры из книги радченко "практическое пособие".
    глава 6 "оптимизация процедуры проведения док-та оказание услуги"
    вписал следующий код:
    Код:
    Процедура ОбработкаПроведения(Отказ,Режим)
    Запрос=Новый Запрос;
    Если Режим=РежимПроведенияДокумента.Оперативный Тогда
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Количество,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    |    ОказаниеУслугиПереченьНоменклатуры.Сумма,
    |    СтоимостьМатериаловОстатки.СтоимостьОстаток,
    |    ОстаткиМатериаловОстатки.КоличествоОстаток,
    |    ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоНаСкладе
    |ИЗ
    |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
    |                &МоментВремени,
    |                Материал В (&СписокНоменклатурыДокумента)
    |                    И Склад = &СкладВДокументе) КАК ОстаткиМатериаловОстаткиНаСкладе
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстаткиНаСкладе.Материал
    |ГДЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
    |
    |ДЛЯ ИЗМЕНЕНИЯ
    |    РегистрНакопления.ОстаткиМатериалов.Остатки,
    |    РегистрНакопления.СтоимостьМатериалов.Остатки";
    Запрос.УстановитьПараметр("СкладВДокументе",Склад);
    Иначе
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Количество,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    |    ОказаниеУслугиПереченьНоменклатуры.Сумма,
    |    ОстаткиМатериаловОстатки.КоличествоОстаток,
    |    СтоимостьМатериаловОстатки.СтоимостьОстаток
    |ИЗ
    |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал
    |ГДЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
    |
    |ДЛЯ ИЗМЕНЕНИЯ
    |    РегистрНакопления.ОстаткиМатериалов.Остатки,
    |    РегистрНакопления.СтоимостьМатериалов.Остатки";
    КонецЕсли;
    Запрос.УстановитьПараметр("МоментВремени",МоментВремени());
    Запрос.УстановитьПараметр("СписокНоменклатурыДокумента",ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    ВыборкаРезультатаЗапроса=Запрос.Выполнить().Выбрать();
    Пока ВыборкаРезультатаЗапроса.Следующий()Цикл
    //проверить остаток при оперативном проведение.
    Если РежимПроведенияДокумента.Оперативный Тогда
    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Материал Тогда
    Остаток=?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе=Null,0,ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе);
    Если Остаток<ВыборкаРезультатаЗапроса.Количество Тогда
    Сообщить("Материал"+СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура)+"имеется только"+Остаток);
    Отказ=Истина;
    Возврат;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    //Сформировато движения.
    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Материал Тогда
    //Регистр ОстаткиМатериалов  Расход
    Движение=Движение.ОстаткиМатериалов.Добавить();
    Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
    Движение.Период=Дата;
    Движение.Материал=ВыборкаРезультатаЗапроса.Номенклатура;
    Движение.Склад=Склад;
    Движение.Количество=ВыборкаРезультатаЗапроса.Количество;
    //Регистр СтоимостьМатериалов Расход
    Движение=Движение.СтоимостьМатериалов.Добавить();
    Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
    Движение.Период=Дата;
    Движение.Материал=ВыборкаРезультатаЗапроса.Номенклатура;
    //Рассчитать стоимость материала
    СтоимостьМатериала=?(ВыборкаРезультатаЗапроса.КоличествоОстаток=Null,0,ВыборкаРезультатаЗапроса.СтоимостьОстаток/ВыборкаРезультатаЗапроса.КоличествоОстаток);
    Движение.Стоимость=СтоимостьМатериала*ВыборкаРезультатаЗапроса.Количество;
    КонецЕсли;
    //Регистр Продажи
    Движение=Движения.Продажи.Добавить();
    Движение.Период=Дата;
    Движение.Номенклатура=ВыборкаРезультатаЗапроса.Номенклатура;
    Движение.Клиент=Клиент;
    Движение.Мастер=Мастер;
    Движение.Количество=ВыборкаРезультатаЗапроса.Количество;
    Движение.Выручка=ВыборкаРезультатаЗапроса.Сумма;
    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Материал Тогда
    Движение.Стоимость=СтоимостьМатериала*ВыборкаРезультатаЗапроса.Количество;
    Иначе
    Движение.Стоимость=0;
    КонецЕсли;
    КонецЦикла;
    //записать движения регистров
    Движения.ОстаткиМатериалов.Записать();
    Движения.СтоимостьМатериалов.Записать();
    Движения.Продажи.Записать();
    КонецПроцедуры
    
    
    ругаеться в режиме предприятия:

    Ошибка при выполнении обработчика - '{Документ.ОказаниеУслуги(59)}: Преобразование значения к типу Булево не может быть выполнено'
    по причине:
    {Документ.ОказаниеУслуги(59)}: Преобразование значения к типу Булево не может быть выполнено

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

    и хотелось бы узнать :{Документ.ОказаниеУслуги(59)}: как это читаеться и чего за цифра в скобках номер строки или что?
  2. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Откройте модуль документа и перейдите на строку 59. Посмотрите что там за выражение, в отладчике (поставьте точку остановки) проверьте какие значения у переменных и в чем может быть проблема.

    Считать какая из ваших строчек 59-я не стану.
  3. tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    да ты и не сможешь :) строки считаются-то от начала модуля...
  4. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    я чего то совсем не понял. это и есть полностью весь модуль.
    в модуле каждая строка считаеться? или например коментарий за строку не считаеться?
  5. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Зайди в модуль и нажми Ctrl+G. Перейдешь к номеру нужной строки.
  6. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    теперь бы хотелось про это подробней. на строку перешёл. точку остановки поставил, а как проверить значения у переменных? они должны выводиться в таблицу или их в модуле глядеть и разбирать?
    поставил точку на 59 строку у меня остановилось без ошибки, то есть теперь надо переставить на 60 и тд. и глядеть где будет ошибка? или цикл проверять после 59 строки?
    и не пинайте сильно я только УЧУСЬ!
  7. tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    выдели мышой что нужно просчитать и жмешь щыфт+ф9 или жамкаешь на кнопку в панели "Вычислить выражение"

    кстати строка в которой стоит точка останова еще не выполнилась, потому и нет ошибки. Если хочешь, чтобы она выполнилась, а потом все остановилось по точке - ставь ее на след. строку...
  8. Melanto
    Offline

    Melanto Опытный в 1С

    Регистрация:
    28 ноя 2007
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    26
    В пункте меню "отладка" расписано, какая клавиша отвечает за выполнение модуля при отладке.
    F10 - Шагнуть через (т.е. просто выполнить строку, не входя внутрь вызываемых ей процедур)
    F11 - Шагнуть в (соответственно, наоборот, все подробно отслеживать)
  9. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    TODD22, вы до этого на чем-нибудь программировали (просто, может, хоть аналогию проведу) - или это ваш первый язык на котором что-то пишете?
  10. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    да программировал. микроконтроллеры на асме и их же немного на С. вот тут то у меня и проблема если бы на С++ то наверное было бы понятней и 1с.
  11. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Ну хорошо, что программировали.
    С++/С перед 1С не принципиальны. В 1С нет полноценного ООП. Главное уловить суть - что все объекты системы делятся функционально (константы, справочники, документы, регистры и т.д.). Внутри еще более тонкое деление и дальше уже - исходя из понимания - можно конструировать и прописывать то, что нам нужно там где нам нужно.

    А отладчиком пользоваться надо просто учиться. В 7.7 он был куда ущербнее... а здесь больше похож на Delphi =)
  12. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    буду разбираться. я как бы понимаю как отладчик работает(когда на МК прогил там тоже есть полноценная среда разработки с отладчиками и тд. вот только там это было удобней сделано и интуитивно понятно, в 1с как то не так). ну как бы полноценного ООП нет, но всё же работа с обьектами мне кажеться похожа. да и говорили что с ООП проще переходить на 1с.
    да и у радченко пока что я ещё может и не дошёл до главы, но описание работы с отладчиком не попадалось.
    так что раз серьёзно за язык взялся буду учить.
    а есть какая нибудь книга где описание возможностей отладчика есть? и как с ним работать?
  13. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Ошибка здесь:

    Код:
        Если РежимПроведенияДокумента.Оперативный Тогда 
    
    Должно быть:

    Код:
        Если Режим = РежимПроведенияДокумента.Оперативный Тогда 
    
  14. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Там так и написано. Но это явно не 59 строка. Хотя фиг знает ;)
    Код:
    Режим=РежимПроведенияДокумента.Оперативный
    
  15. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Уж не знаю, какой номер строки, но там именно так написано. То есть это проверка режима, а в булево преобразовывается тип "Режим проведения документа"
  16. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    да это 59 строка. сделал как написано. пишет что переменная не определена. сегодня попробую разобраться.
    сделал как написал Федя Сумкин. помогло! теперь ошибка в 72 строке.
    ругаеться: Ошибка при выполнении обработчика - '{Документ.ОказаниеУслуги(72)}: Поле объекта не обнаружено (ОстаткиМатериалов)'
    по причине:
    {Документ.ОказаниеУслуги(72)}: Поле объекта не обнаружено (ОстаткиМатериалов)
    это где ошибку искать в модуле или в регистре?

    72 строка:
    Код:
    Движение=Движение.ОстаткиМатериалов.Добавить();
    
  17. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Должно быть не
    Код:
    Движение=Движение.ОстаткиМатериалов.Добавить();
    
    
    а

    Код:
    Движение=Движения.ОстаткиМатериалов.Добавить();
    
    
    Движения - это фиксированная коллекция доступных движений документа
    Движение - это просто наша локальная переменная
  18. TopicStarter Overlay
    TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Федя Сумкин спасибо большое за помощь! я уже разобрался, вся беда у меня в апечатках, ну и конечно же незнание языка.
    вот у меня такой вопрос. как научиться писать процедуры? читать могу, синтаксис более менее понятен(ну местами конечно есть пробелы в знаниях, но это дело времени) а вот сам никак не могу даже простую процедуру написать.
    у меня большое непонимание методов, то есть разобрался с переменными, а вот с методами никак. меня интересует есть ли какое нибудь описание какие у какого обьекта методы, то есть например взять общие для всех обьектов и те которые для определённых обьектов и какой нибудь список что ли? или что нибудь подобное. или я чего то может ещё не понимаю?
    а за помощь всем большое спасибо!

    "Движения - это фиксированная коллекция доступных движений документа" а вот об этом можно подробней? какие ещё бывают коллекции, ну и наверное как с ними работать?
  19. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Читай по-больше книжек, загляни в раздел литература.
    Вот простой код процедуры:
    Код:
    Процедура ВыводСообщения(Сообщение)
    Сообщить(Сообщение);
    КонецПроцедуры
    
    Передаешь в эту процедуру любой текст и она выводит его. Процедуры и функции несложно писать, самое главное-знать синтаксис и правильно построить алгоритм.
  20. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Нужно просто надыбать где-нибудь коробку с программой (из-под программы) и посмотреть описание встроенного языка. На данный момент это 7 (!) томов.
    Можно, конечно, читать типовой код, но это не совсем для новичков...

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

    Регистры состоят из измерений и ресурсов. Если регистр периодический, то добавляется предопределенное измерение типа "Дата". В ресурсах хранятся значения, соответствующие набору измерений.

    Регистры сведений используются для хранения информации в определенных разрезах.
    Накопления - для хранения информации в количественном выражении с возможностью получения итогов.

    Регистры состоят из наборов записей, наборы записей из записей.
    Манипулировать можно наборами записей.

    Наборы записей могут быть связаны с регистратором - документом или быть независимыми (добавляться вручную).

    Наборы записей регистров накопления всегда связаны с регистратором.

    То есть, со стороны документа, он может регистрировать наборы записей в регистре. И эти записи являются его движениями.

    Регистров, для которых документ может быть регистратором может быть несколько, то есть коллекция.
    А поскольку манипулировать составом этой коллекции можно только на этапе разработки программного решения, она называется фиксированной.

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