2

Угораздило меня работать с 1С, ЯП вообще похож на православный. Но не суть.

В общем такое дело: как я понял, в 1С можно ловить различные события, и даже такое, как создание/изменение документа. Собстно, что такое документ продажи, показываю наглядно:

alt text

Вот значит. После создания этого документа мне нужно отправить на веб-сервер полную инфу о данном документе, а также информацию о контрагенте, который вписан в этот документ.

Как вешать обработчики на события нашел: Подписка на событие (Event Subscription).

Первый вопрос такой: Какая функция отвечает за обработку события создания/редактирования документа продажи?

Второй вопрос такой: почему в базе mssql, с которой работает 1C, ТАК МНОГО ТАБЛИЦ? БЛДЖ.

lampa
  • 18,094
  • Когда меня угораздило связаться с 1С, то "ЯП" у меня ассоциировалось не с "Язык программирования", а с "Я плакал". Но дичайший анальный зуд, который вызывало у меня данное чудо человеческой фантазии, со временем стал утихать :) – teanЫЧ Dec 06 '12 at 07:57
  • @teanЫЧ пришел к выводу, что лучше заюзать "ПослеЗаписиНаСервере", т.к. там все значения содержаться. Низкий поклон за разъяснения :-) – lampa Dec 06 '12 at 13:45
  • Всегда пожалуйста) – teanЫЧ Dec 06 '12 at 13:53
  • @Yura Ivanov спасибо, учту в будущем. – lampa Dec 07 '12 at 22:51

2 Answers2

5

1.

Чтобы перехватить создание (запись) нового документа, используйте обработчик ПередЗаписью. В него передаётся параметр Источник, это объект который записывается. Для нового документа Источник.Ссылка.Пустая() будет Истина. Так-же в обработчик будут переданы параметры РежимЗаписи и РежимПроведения.

Если Источник.Ссылка.Пустая() И РежимЗаписи = РежимЗаписиДокумента.Проведение тогда
    // Отлавливаем проведение нового документа
    //
КонецЕсли;

2.

На сервере БД создаётся по таблице на каждую сущность (справочник, документ), по таблице на каждую табличную часть справочника или документа, и так далее... Вот тут достаточно подробно расписано назначение таблиц.

mantigatos
  • 10,106
  • Еще вопросик: куда, собственно, данный код вставлять? Я значит открыл конфигуратор. Дальше думаю, сюда по всему, нужно открыть "конфигурация" -> вызвать контекстное меню и выбрать какой-то модуль. Что выбирать? – lampa Dec 06 '12 at 07:19
2

Еще вопросик: куда, собственно, данный код вставлять?

  • Открываете конфигуратор, открываете конфигурацию (если она у вас не открыта), в конфигурации ищите нужный документ. Открываете документ. Видите настройки. Находите вкладку "Формы". Открываете форму документа. Кликаете на саму форму, находите справа в свойствах события. Находите нужное событие, дважды по нему кликаете и оказываетесь в модуле, где вам и предлагают писать код.

    Картинка огромная, и сильно ужалась, но все равно все понятно :)

    alt text

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


По идее переменная "Параметры записи" содержит массив значений

  • Чтобы узнать, что находится в том или ином объекте и с чем его едят - выделите его, потом Shift + F9. После чего откроется табло, в котором будет данный объект, и у него будет указан тип + все его свойства и их значения.

  • Предупреждая следующий вопрос: чтобы перейти в то место в коде, где описан объект или процедура/функция - выделите нужную область и потом F12

  • В 1с огромное количество сущностей и связей :) Я в этом лично убедился, когда делал экспорт данных из одной системы в другую. Данные выгружаются и загружаются по 2 часа, в итоге получается под миллион выгруженных объектов, и xml файл с размером 10 Gb. Что интересно, так как сама база весит только 4 =/

PS. православный улыбнул

teanЫЧ
  • 4,685
  • О, я поклоняюсь вам. А такой вот вопрос: по идее мне нужно "после" создания документа вызывать событие, т.к. мне нужно получить еще и номер. Или номер выдается сразу же? – lampa Dec 06 '12 at 08:22
  • Указывать номер нужно перед записью. Хотя бы для того, чтобы проверить, существует ли уже документ с таким номером. Можете в обработчике "Перед записью" автоматически генерировать номер или сделать поле ввода на форме и указывать его вручную.

    Вы бы почитали книжки по 1С. Почти в каждой из них в самом начале подробно описывается все это.

    – teanЫЧ Dec 06 '12 at 08:36
  • @teanЫЧ задача на 2 чиха. Скоро новый год, хочется отдохнуть, хочется запилить себе бабла и не хочется напрягаться :-) Номер, как я выяснил, подставляется автоматом, типа инкремента. Что же делать, как тут быть? Может быть не стоит париться и просто забирать последний документ после создания оного? – lampa Dec 06 '12 at 09:24
  • Вы всегда можете сделать SQL запрос и вытащить нужный вам документ :) Тут уж на ваше усмотрение: либо по дате (последний созданный) либо по номеру (наибольшее число).

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

    Не смотря на то, что это похоже на сферический баг в вакууме, с подобным я сталкивался.

    – teanЫЧ Dec 06 '12 at 09:54
  • Так что создаете документ, и потом напрямую обращаетесь к его свойству "Номер" – teanЫЧ Dec 06 '12 at 09:55
  • Ок, но событие-то уже не то получается? Получатся так: событие должно вызваться после создания документа со всеми данными документа. – lampa Dec 06 '12 at 09:59
  • 1
    Есть событие "ПослеЗаписи". Оно срабатывает, когда документ записался. По сути дела вы заполняете данные, создаете документ, и он записывается в базу. В данном событии вы лехко можете обратиться к данным документа, и в этот момент у объекта уже будет проставлен номер. – teanЫЧ Dec 06 '12 at 10:08
  • @teanЫЧ угу, с этим понятно. Такой вопрос еще: "Процедура ПослеЗаписи(ПараметрыЗаписи)". По идее переменная "Параметры записи" содержит массив значений. Искать лень :-( Как разобрать? – lampa Dec 06 '12 at 12:48
  • 1
    Хм, рассмотрел картинку. Не верный ответ вообще-то. Документ может быть создан не обязательно в форме документа. Обработкой, например. Отлавливать запись документа надо либо подпиской на соответствующее событие (как в вопросе указано), либо в модуле объекта соответсвтующий обработчик.

    Чтобы не портить конфу своим кодом, красивее создать отдельный общий модуль, и создать в нем подписку для ДокументОбъект.<ВашДокумент>, событие ПриЗаписи, обработчик в этом новом модуле (лупу жмем, само все создастся). В этом обработчике получаем заполненный документ в переменной Источник.

    – Yura Ivanov Dec 07 '12 at 22:37