Экзамен "1С:Специалист" по платформе 8.3 — заметки для успешной сдачи (обновлено 20.08.2014)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

97 Comments

  1. wtlz

    спасибо! дома почитаю! (сам начинаю готовится)

    Reply
  2. hame1e00n

    Не за что)) Задавай вопросы, если будут)))

    Reply
  3. b22igor

    Спасибо!

    Оч доступно и понятно

    Reply
  4. yukon
    Условие в запросе вида «Или указанная номенклатура или любая, если не указана»



    Решается следующим условием в самом запросе:

    Номенклатура = &Номенклатура ИЛИ &Номенклатура = Значение(Справочник.Номенклатура.ПустаяСсылка)

    И непопаданием в индекс (вы же не забыли проиндексировать реквизит «Номенклатура»?)

    Reply
  5. hame1e00n

    (4) yukon, не понял, поясните, пожалуйста, что хотите сказать?

    Reply
  6. yukon

    (5)

    Условия вида «а или б» неэффективно используют индексы.

    В данном случае, поле «Номенклатура» нужно проиндексировать ибо «В задачах получения данных из информационной базы установка отборов по неиндексированным полям -0,5». Приведенное условие эффективней всего отработает при «ГДЕ Номенклатура = &Номенклатура». С другой стороны при пустой номенклатуре индекс вообще не используется, т.к. попросту не нужен. Приведенное решение ухудшает выполнение запроса с заполненной номенклатурой, а при пустой номенклатуре никакого влияния не оказывает, т.к. оптимизатор отбросит условие «Х или истина».

    Т.е. оптимальным будет:

    Если ЗначениеЗаполнено(Номенклатура) Тогда
    Запрос.Текст = Запрос.Текст + » ГДЕ Номенклатура = &Номенклатура»;
    Запрос.УстановитьПараметр(«Номенклатура», Номенклатура);
    КонецЕсли;
    

    С появлением объектной модели запроса в 8.3.5 условие можно будет добавлять безопаснее:

    Если ЗначениеЗаполнено(Номенклатура) Тогда
    Запрос1.Отбор.Добавить(«Номенклатура = &Номенклатура»);
    Запрос.УстановитьПараметр(«Номенклатура», Номенклатура);
    КонецЕсли;
    
    Reply
  7. hercares

    Спасибо за труды

    Reply
  8. Yashazz

    Замечу только одно: на экзаменах в 1С принимают не работающие решения, а решения, правильные с точки зрения конкретного экзаменатора. Я это почему знаю: когда 8.0 только появилась, я предлагал пост-контроль остатков при оперативном проведении, и эту концепцию забраковали напрочь; спустя каких-то 6 лет именно её требовали с ножом у горла и за другие варианты снижали балл. Прошу заметить, регистры были в обоих случаях отстроены одинаково, т.к. на экзамене по сию пору не требуют разделители, хитрое управление остатками и прочая.

    Поэтому — спасибо, конечно, и поздравляю со счастливым случаем под названием «удалось сдать». Мне вот за 5 раз не удалось, хотя платформу, как выяснилось, знаю получше иных сдавших. Найденные решения рассмотрю, авось что пригодится в реальной практике.

    Reply
  9. Infactum

    (8) Yashazz, пост контроль стали требовать только с приходом 8.2, т.к. добавили флаг «Записывать» у движений. В более ранних версиях платформы при завершении процедуры проведения движения записывались автоматически. Итого выходила бы двойная работа.

    Кстати на очной аттестации никто вам не запрещает по дискутировать с экзаменатором. Свою точку зрения отстоять можно — проверенный факт. А вот на дистанционной аттестации все не так радужно.

    Reply
  10. AlX0id

    (6) yukon,

    Ну это же не ЭТВ ) Такого там не проверяют.

    Пробежался посмотреть, чем же отличаются требования к 8.3 от 8.2 — ровным счетом ничем..

    Reply
  11. wtlz
    Параметры виртуальной таблицы накладываем на измерения, а не на ресурсы.

    Если не ошибаюсь (только что проверил к конструкторе) — параметры можно наложить ТОЛЬКО на измерения. Или имелось ввиду что-то другое?

    Reply
  12. mpudy

    (11) wtlz, как проверяли? Конструктор дает в параметрах среза последних делать отбор даже по реквизитам.



    Скорее всего вы смотрели для регистров накопления.

    Reply
  13. wtlz

    (12) mpudy, ну да… не туда посмотрел.

    Reply
  14. hame1e00n

    (11), (12) Спасибо, за замечание, написал более корректно — «Условия при установке параметров виртуальной таблицы для получения среза последних накладываем на измерения, а не на ресурсы»

    Reply
  15. hame1e00n

    (6) yukon, спасибо, отредактировал 🙂

    Reply
  16. mikhailovaew

    в листинге «Разбивка периода действия отпуска по месяцам при записи наборов записей регистра» немного смущают манипуляции с графиком, видимо, описка:


    Движение.График = ТекСтрокаОсновныеНачисления.График;

    Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр;

    Движение.График = Справочники.Графики.Шестидневка;

    Reply
  17. grand.pers

    При работе с регистрами в модуле объекта в самом начале процедуры проведения необходимо очищать движения текущего документа по регистру.

    Согласен-сам столкнулся с этим недавно.

    спасибо за статью.

    Reply
  18. hame1e00n

    (16) mikhailovaew, спасибо, исправил 🙂

    Reply
  19. hame1e00n

    (17) grand.pers, да, в случае если движения задвоятся, на экзамене можно не сразу сообразить в чем дело и потерять достаточно много времени на поиск ошибки.

    Reply
  20. borda4ev

    Спасибо за публикацию, сейчас сам готовлюсь к сдаче, потихоньку прорешиваю все задачки из сборника, начинал для себя делать что то подобное, действительно, эти мелочи, если долго готовишься, могут подзабыться;

    Пара дополнений:

    1. Есть гугл док, с текстами актуальных билетов. Там можно задать вопрос, постоянно тусуется в документе около 30 человек, да и там все подводные камни уже расписаны; Ссылку приводить не буду, очень легко ищется на сайте Чистова;

    2. В расчетных задачах, в ряде задач есть формулировка «Позволить пользователю редактировать результат», что говорит о том, что расчет, производится по кнопке на форме , просьба особо камнями не кидать, сам нашел подобное решение, в одной из решенных задач на форуме Чистова, если кто то подтвердит или опровергнет, очень поможете:

    Собственно Принцип самой конструкции;

    1. Вызывается по кнопке из формы, располагается в модуле документа, естественно выполняется на сервере;

    2. Процедура выполняется в транзакции,

    3. Стандартные запись и очистка движений;

    4. Расчет и запись результата в таб часть документа;

    5. Фиксация транзакции, очистка движений;

    При проведении, записываются уже рассчитанные результаты, из табличной части;

    Reply
  21. monkbest

    (19) а разве нельзя сейчас устанавливать автоматическое удаление движений? это теперь плохой тон?

    есть же свойства Записывать движения при проведении и Удаление движений

    я всегда, если не предполагается в документе непосредственное изменение движений пользователем, использую автоматические режимы (удалять автоматически и Записывать модифицированные)

    Reply
  22. hame1e00n

    (20) iTony73, дай ссылку на гугл док если несложно, добавлю в публикацию, может кому будет полезно 🙂

    Reply
  23. Sergey.Noskov

    >Табличную часть документов лучше называть просто «ТЧ»

    А все переменные лучше называть просто а1, а2 и т.д., оч быстро пишется.

    #Сарказм

    Reply
  24. Yashazz

    Кстати, насчёт этого утверждения:

    А значение реквизита доступно только в реальной таблице регистра расчета, в виртуальных таблицах его нет.

    — проверьте, будете удивлены. Вообще, советую почитать http://langslab.com/ebooks/prof-dev2/tome2/pr-dev-t2-ch13

    Reply
  25. hame1e00n
    Reply
  26. hame1e00n

    (21) monkbest, поэтому на практике просто используется три строчки кода которые я написал в публикации.

    Возможно, что когда-то эта методика изменится, какое-то свойство добавится или еще что-то случится, но сейчас так:

    Перед началом работы с регистром на автомате пишешь так:

    Движения.НазваниеРегистра.Записывать = Истина;

    Движения.НазваниеРегистра.Очистить();

    И можно еще чтобы не было проблем с существующими текущими движениями при анализе остатков по этому регистру перед записью:

    Движения.НазваниеРегистра.Записать();

    Далее принудительно можешь не вызывать в конце Движения.Записать() — все движения со взведенным флагом Записывать = Истина запишутся автоматически

    Reply
  27. borda4ev

    (22) по ряду причин, не имею возможности это сделать:-)))

    Reply
  28. hame1e00n

    (23) serno, каждый выбирает сам как называть))

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

    Но мои рекомендации помогут сэкономить время)))

    Reply
  29. slazzy

    Перед записью движений можно ещё свойство БлокироватьДляИзменения поставить в истину, управляемые блокировки же…

    Reply
  30. hame1e00n
    Reply
  31. slazzy

    (30)

    спасибо за такое детальное объяснение, но дело в том, что я в общем-то уже имею этот сертификат и прекрасно знаю, какие есть методики проведения 🙂 не стоило.

    Вы допустили одну ошибочку,


    То есть последовательность такая:

    1. Устанавливаем блокировку с помощью объекта БлокировкаДанных

    2. Читаем остатки

    3. Проверяем возможность списания

    На самом деле перед этими действиями надо очистить движения

    Движения.НазваниеРегистра.БлокироватьДляИзменения = Истина;
    Движения.НазваниеРегистра.Записывать = Истина;
    Движения.НазваниеРегистра.Очистить();
    Движения.НазваниеРегистра.Записать();
    

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

    Reply
  32. hame1e00n

    (31) slazzy, мои старания не пропали даром, я добавил это в публикацию))

    По поводу возможной ошибки — ее нет — очищать движения нужно в обоих случаях 🙂

    Reply
  33. slazzy

    (32) не совсем 🙂 во втором случае из вашего примера, движения надо очищать, но не записывать. А в первом случае, собственно к чему я всё это и писал, вы не написали Движения.НазваниеРегистра.БлокироватьДляИзменения = Истина;

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

    Reply
  34. PLAstic

    Коллеги! Я вот выбираю любой документ, нажимаю Alt-Enter и там есть параметр «Запись движений при проведении», который обычно стоит в значении «Записывать модифицированные» и избавляет от геморроя с отметкой каждого набора записей, который нужно записывать.

    В чём ошибка использования данного свойства и отказа от использования предлагаемого автором способа с «Записывать = Истина» ? Или автор об этом просто не знал?

    Reply
  35. hame1e00n

    (33) slazzy,

    «hame1e00n, не совсем 🙂 во втором случае из вашего примера, движения надо очищать, но не записывать. А в первом случае, собственно к чему я всё это и писал, вы не написали Движения.НазваниеРегистра.БлокироватьДляИзменения = Истина;

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

    1. Чуть выше написал, зачем записываю очищенные движения — чтобы в регистре не было информации по старым движениям документа.

    2. При указании БлокироватьДляИзменения = Истина, регистр блокируется в момент записи по набору ключевых полей записываемых данных, а если мы их уже исправили, то набор будет новый. Но у нас и так есть блокировка с помощью объекта БлокировкаДанных с указанием этих измерений.

    То есть: Дублируется блокировка

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

    Подтверждение моих слов из СП по поводу свойства БлокироватьДляИзменения:

    «Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей. Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. В этом случае можно не использовать объект БлокировкаДанных

    Мне кажется преподаватель не упустит случая снять баллы.

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

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

    Если так рассуждать, то хорошему блокировать нужно регистр и в момент прихода товара, но я этого не видел в решениях.

    Блокировался регистр только в момент проведения документа списания, а вернее правило такое:

    «Блокировать нужно в том случае, если текущее состояние регистра влияет на формирование новых движений»

    Как пример: посмотрели, что товара хватает в остатках, заблокировали регистр, чтоб другой пользователь не мог его списать, сделали списание 🙂

    Reply
  36. slazzy

    (35)

    Движения.НазваниеРегистра.БлокироватьДляИзменения = Истина;
    Движения.НазваниеРегистра.Записывать = Истина;
    Движения.НазваниеРегистра.Очистить();
    Движения.НазваниеРегистра.Записать();

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

    К примеру у вас есть документ 1, в нем вы продаете 10 яблок.

    Вдруг вы решили, что в этом документе на самом деле вы продаете 10 груш, заходите в документ и изменяете яблоки на груши.

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

    То есть последовательность такая:

    1. Устанавливаем блокировку с помощью объекта БлокировкаДанных

    2. Читаем остатки

    3. Проверяем возможность списания

    4. Формируем движения, к примеру списываем товар

    5. После проведения документа блокировка автоматически снимается (блокировка действует в рамках транзакции проведения и снимается автоматически системой). То есть как-то специально разблокировать объект не надо.

    Где-то между пунктами 1-5 другой человек заходит в другой документ и продает 10 яблок. И проводит эту операцию успешно, ведь яблоки не заблокированы. И по прежнему в общем-то ничего страшного.

    А вот теперь страшно 🙂 вдруг оказывается, что груш у вас нет на складе и на шаге 3 вы выставляете отказ в истину и отменяете транзакцию. И у вас получается -10 яблок на складе…такие дела.

    Reply
  37. hame1e00n

    (34) PLAstic,

    «Коллеги! Я вот выбираю любой документ, нажимаю Alt-Enter и там есть параметр «Запись движений при проведении», который обычно стоит в значении «Записывать модифицированные» и избавляет от геморроя с отметкой каждого набора записей, который нужно записывать.

    В чём ошибка использования данного свойства и отказа от использования предлагаемого автором способа с «Записывать = Истина» ? Или автор об этом просто не знал?»

    Из СП:

    «ЗаписыватьВыбранные (WriteSelected)

    Описание:

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

    «ЗаписыватьМодифицированные (WriteModified)

    Описание:

    Все наборы записей, участвующие в регистрации движений документа имеют значение свойства Записывать установленным системой по умолчанию в Истина.»

    Что значит «обычно»? Создайте новый документ — по умолчанию стоит как раз «Записывать выбранные».

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

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

    По моему скромному мнению, лучше делать однотипно, как хочет 1С и как она принимает.

    Я не спорю, что могут быть другие варианты, возможно в каких-то ситуациях более оптимальные (хотя не уверен), но думаю преподаватель не будет особо разбираться во всех тонкостях. Если для него решение будет очень сильно отличаться от типично правильного, то он может посчитать, что Вы сделали неправильно.

    Reply
  38. hame1e00n

    (36) slazzy,

    «Движения.НазваниеРегистра.БлокироватьДляИзменения = Истина;

    Движения.НазваниеРегистра.Записывать = Истина;

    Движения.НазваниеРегистра.Очистить();

    Движения.НазваниеРегистра.Записать();

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

    К примеру у вас есть документ 1, в нем вы продаете 10 яблок.

    Вдруг вы решили, что в этом документе на самом деле вы продаете 10 груш, заходите в документ и изменяете яблоки на груши. «

    Я понял и раньше о какой ситуации Вы говорите 🙂

    Откуда уверенность, что заблокируется старый набор записей? ИМХО, ничего не заблокируется — вы попытаетесь заблокировать по набору измерений, но блокировать нечего — движения то вы очистили. Разве нет?

    Говорю ж, тогда по идее надо записывать старый набор записей перед очисткой, но ИМХО это — чересчур, очень легко можно нахватать штрафных баллов (преподаватель может не понять), по моему 0.5 за каждую лишнюю запись движений.

    Reply
  39. slazzy

    (38)

    Откуда уверенность, что заблокируется старый набор записей? ИМХО, ничего не заблокируется — вы попытаетесь заблокировать по набору измерений, но блокировать нечего — движения то вы очистили. Разве нет?

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

    И да, я только что провел небольшой тест, который это подтвердил 🙂 выставил время ожидания на блокировке 20с, сделал цикл работающий 25с после блокировки. Сначала провожу одну реализацию, в которой Товар1 и Товар3, после этого удаляю товар1 и перепровожу. В момент перепроведения создаю новый документ(в другом сеансе), в котором продаю товар1, через 20с сеанс вываливается с ошибкой превышения времени ожидания на блокировке.

    Вывод —

    «Движения.НазваниеРегистра.БлокироватьДляИзменения = Истина;

    Движения.НазваниеРегистра.Записывать = Истина;

    Движения.НазваниеРегистра.Очистить();

    Движения.НазваниеРегистра.Записать();

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

    ЗЫ Кстати и правда, у Павла Чистова именно это и написано в статье, которую прежде всего рекомендуется прочитать.

    http://infostart.ru/public/195591/

    Reply
  40. slazzy

    (34) PLAstic,

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

    Reply
  41. hame1e00n

    (40) slazzy,

    да, и при любой записи всех движений…

    Reply
  42. hame1e00n

    (39) slazzy,

    Ооо, спасибо за такое подробное описание и за ссылку))) Почитаю 🙂

    Но для экзамена это наверное слишком тонкий момент, в его видеоуроках я такого не видел (я проходил курс).

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

    🙂

    Reply
  43. vandalsvq

    Как то иногда всплывает мысль мол какой я спец, если 1С:Специалист не получил :)))).

    Но вот такие вот вещи как

    Только не забудьте когда все сделаете поставить снова «Такси»! Иначе экзаменатор снимет балы!

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

    Reply
  44. slazzy

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

    И ещё изменение, как это было анонсировано, что вырастет число задач и билеты будут не одинаковыми, а будут формироваться перед экзаменом из разных частей.

    Нельзя же так просто всех принуждать, а то ведь нехорошо это как то.

    Можно ) ничего нехорошего в этом нет. Вы же сдаете экзамен на УФ, а не в обычных. Так же и тут просто требование времени.

    Reply
  45. hame1e00n

    (43, 44)

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

    Есть, задача по работе с картинками, но это наверное единственная задача.

    У Павла Чистова есть подробная статья как работать с диалоговыми окнами в новом режиме отказа от модальности.

    Но я, честно говоря, не стал заучивать как это делается — очень мала вероятность что эта задачка попадется.

    + использование интерфейса Такси, но как я уже говорил разрабатывать на нем задачи очень неудобно, лучше переключить, но в требованиях четко завялено, что проверяется умение работать в этом интерфейсе, поэтому переключить назад на Такси интерфейс нужно обязательно, иначе снимут балы. Будет очень обидно из-за такой мелочи, по сути ничего не значащей…

    И да, обещают вроде сборник, где количество задач увеличат.

    Я сдавал совсем недавно — пятой задачи по управляемым формам не было, по ОУ, БУ, БП задачи из сборника, а вот по расчету зп такое ощущение задача упрощена была.

    В общем задачи попались не сильно объемные и сложные, но вот компы — очень плохие, мышка вообще никакая — сдавал удаленно, еле успел из-за этого.

    Reply
  46. AnryMc

    (8) Yashazz,

    Пример «правильного» ответа от 1С

    http://infostart.ru/public/97489/ «Экзамен 1С Профессионал — Приколы»

    П.С. Главное — выучить «правильный ответ» а не знание…

    Reply
  47. hame1e00n

    (46) AnryMc, не стоит так категорично говорить — да, бывают и проблемы, но в итоге ведь очень-очень много зависит от сдающего. Можно ведь и апелляцию подать 🙂

    Reply
  48. Bukaska

    (46) AnryMc, Ахахах))) тоже читала.. под столом была…

    вот потому я пока что и не суюсь на экзамены.. что кто их знает.. этих тараканов)))

    Reply
  49. mulla1979

    Спасибо автору за хорошую статью! Кстати, вчера вышли новые задачи http://1c.ru/news/info.jsp?id=18610

    Reply
  50. gorski

    Решение должно быть правильным как с прикладной точки зрения, так и с позиции платформы. Все преподаватели на экзамене оценивают одинаково объективно, все остальные мнения — мифы… Мы с коллегой сдали очный экзамен с первого раза. Очень рекомендую курсы фирмы 1С от Павла Белоусов по конфигурированию http://www.1c.ru/rus/partners/training/uc1/course.jsp?id=75 и консультации к экзамену http://www.1c.ru/rus/partners/training/uc1/course.jsp?id=160. Он один из преподавателей принимающих экзамен, является создателем правил проведения экзамена, автором задач сборника, 15 лет опыта, умеет ученую степень и т.п. и т.д. Чем более подготовленными вы пойдете на курсы, тем эффект будет круче! Вас будут не просто учить программировать, а научат правильно понимать платформу. Такой полноты и глубины знаний и понимания платформы из книг не достать. За эти 4-5 дней вы получите очень большой объем информации. Вам не нужны будут правила, поскольку вы будете понимать и знать что делать. Правила обычно заучивают, забывая как и при каких обстоятельствах они были сформулированы. Нужно помнить, ведь у любых правил есть исключения… Не нужно гоняться за суррогатами, возьмите знания из первоисточника (или подправьте свои уже сформированные знания). Если есть возможность сходите на эти курсы, в любом случае не пожалеете, даже если пока не собираетесь сдавать экзамен.

    Reply
  51. Bukaska

    (45)

    В общем задачи попались не сильно объемные и сложные, но вот компы — очень плохие, мышка вообще никакая — сдавал удаленно, еле успел из-за этого.

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

    Reply
  52. Yashazz

    (50) Не рассказывайте сказки. Моя жена ходила сдавать «Спеца» по ЗУП, экзаменатор мельком глянул, сказал, что всё неверно и до свидания. Она подала апелляцию, на разборку подтянулся лично Харитонов (думаю, не надо объяснять, кто это). Так вот, при детальном разборе выяснилось, что а) экзаменатор допустил логический ляп, б) Харитонов не в курсе специфики работы современных ЗУП, в) решение моей жены оптимально, красиво, методически верно. Только непривычно.

    А если б не очно, да без желания что-то доказывать — нафиг надо. Мне вот просто противно стало с этим связываться. Тем более, когда дипломированный «спец» по платформе спрашивает меня, «а чо такое агрегаты», даже как-то приятно, что я на это дело плюнул.

    Reply
  53. hame1e00n

    (52) Bukaska, не знаю, я удаленно в Воронеже сдавал. Лучше свою клавиатуру и мышку брать)

    Reply
  54. hame1e00n

    (53) Yashazz, жена в итоге сдала по результатам апелляции?

    Ну вот и я о том же, что надо делать так, как они хотят видеть, чтобы сдать.

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

    Reply
  55. Yashazz

    (55) Жена с мобилы дала им прочитать нужные моменты в нужных официальных источниках (в т.ч. 1С-овских) и таки доказала правоту. Сдала. Но, согласитесь, это исключение.

    Reply
  56. hame1e00n

    (56) Yashazz, хорошо, что сказали про это, а вообще на заметку всем сдающим: не нужно бояться отстаивать свою правоту, в том числе подавать апелляцию.

    Reply
  57. gorski

    (53) Yashazz, это не сказки. Прошу Вас быть аккуратнее с высказываниями…

    Не рассказывайте сказки.

    Я писал про Специалиста по платформе, про ЗУП ничего ни хорошего, ни плохого сказать не могу. Агрегаты на экзамене по платформе не рассматриваются, так для информации.

    Если считаете себя правильным и всезнающим, возьмите и сдайте на Спеца без лишних слов и взаимных обвинений. Это у многих получилось, и не нужно здесь искать себе оправданий… Это лишь Ваше мнение. С нами сдавал программист, который делал уже 6-ую попытку — все относительно.

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

    Reply
  58. Bukaska

    (53) Yashazz, Дело в том.. что решения можно скатать.. кто тупит — значит на компе нашел правильный пример и скатал с кого -то.., а кто знает — тот сдавал сам и шпор в компе не искал…

    Так что это всё зависит от того..КАК ты сдаешь)

    Reply
  59. FractonKireyev

    Я совсем не новичок в 1С, а из этой статьи узнал очень много новой и полезной информации.

    Спасибо автору!!!

    Reply
  60. Sergey.Noskov

    (28)

    Времени всегда не хватает, ни на экзамене ни на проекте, но это ж не повод, понравится — привыкнешь, потом долго отвыкать ))

    Reply
  61. dimaster

    (22) в гугле (не яндексе) «гугл док Чистова 1С платформа» и самый топ )

    Reply
  62. fishca

    Я бы

    Результат = Запрос.Выполнить();
    
    Если Не Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    МетодСписанияСебестоимости = Выборка.МетодСписанияСебестоимости;
    КонецЕсли;
    

    Показать

    заменил на:

    ТРезультат = Запрос.Выполнить().Выгрузить();
    МетодСписанияСебестоимости = ?(ТРезультат.Количество(), ТРезультат[0].МетодСписанияСебестоимости, Неопределено или же ПустоеЗначениеТипа);
    
    Reply
  63. Allexe8.1

    Номенклатура = &Номенклатура ИЛИ &Номенклатура = Значение(Справочник.Номенклатура.ПустаяСсылка)

    можно еще так:

    Номенклатура В (Значение(Справочник.Номенклатура.ПустаяСсылка),&Номенклатура)
    
    Reply
  64. Zord

    Отличная статья! А про Alt+* я вообще не знал… и как я до этого жил!? «Век живи — век учись»

    Reply
  65. spetzpozh

    Сдал вчера в УЦ №1. Как написал Yashazz: «Замечу только одно: на экзаменах в 1С принимают не работающие решения, а решения, правильные с точки зрения конкретного экзаменатора» — могу подписаться. Чтобы вообще понимать, что хочет 1С, я прошел очный курс по платформе в том же УЦ №1 и дополнительно мастер-класс через веб в УЦ №3. Везде эта «новая» методика.

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

    Сделал, как уже выработался рефлекс у собаки Павлова — записал набор в складской, если минусов нет — запрос и списываю партии. На что экзаменатор сказал — «а вы что, считаете, что в вашем случае это будет эффективней старой методики?». И тут сложно поспорить, но после всех источников информации и после курсов я это сделал с полной уверенностью.

    Еще лажанулся в чтении задания и в б/у сделал субконто Склад суммовое, а списание себестоимости должно быть только партионное. И вообще, билет был очень странный, т.к. сейчас они генерятся рандомно — у меня по факту в б/у и о/у абсолютно одинаковые задания списания по партиям. А доп. задачи на упр. формы вообще не имели отношения к тем объектам, которые были в базе созданы и использованы. В итоге 3.

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

    Курс Чистова мне помог, но его решения сложно назвать эталонными с т.з. 1С. Я его почти весь прошел, но сначала решал сам, потом уже смотрел, как он делает. Было полезно.

    Резюмируя, я бы настоятельно рекомендовал пройти какой-то курс от 1С, либо курс по платформе, либо курс-консультация к экзамену. За время подготовки ни одного «чужого» решения из Интернета не смотрел, чему и рад.

    Reply
  66. sdx

    автору респект, хорошо написал, понятно.

    Reply
  67. ignatievl

    1. Есть гугл док, с текстами актуальных билетов. Там можно задать вопрос, постоянно тусуется в документе около 30 человек, да и там все подводные камни уже расписаны; Ссылку приводить не буду, очень легко ищется на сайте Чистова;

    2. В расчетных задачах, в ряде задач есть формулировка «Позволить пользователю редактировать результат», что говорит о том, что расчет, производится по кнопке на форме , просьба особо камнями не кидать, сам нашел подобное решение, в одной из решенных задач на форуме Чистова, если кто то подтвердит или опровергнет, очень поможете:

    Собственно Принцип самой конструкции;

    1. Вызывается по кнопке из формы, располагается в модуле документа, естественно выполняется на сервере;

    2. Процедура выполняется в транзакции,

    3. Стандартные запись и очистка движений;

    4. Расчет и запись результата в таб часть документа;

    5. Фиксация транзакции, очистка движений;

    При проведении, записываются уже рассчитанные результаты, из табличной части;

    Reply
  68. KliMich

    Спасибо! Понятно, доступно и всерьез!

    Reply
  69. spetzpozh

    (68) ignatievl, о каких актуальных билетах идет речь? 🙂 Вышел задачник по 8.3 в июле вроде, задачи оттуда и билеты генерятся случайным образом. По п.2 вы верно написали.

    Reply
  70. Gendalf_beliy

    Спасибо огромное за ваши труды. И правда часть из этого ранее не знал и возьму теперь на вооружение.

    Reply
  71. DexterMorgan777

    Спасибо. Очень пригодится.

    Reply
  72. Amory

    Спасибо, очень полезно

    Reply
  73. hame1e00n

    Очень рад, что кому-то это будет полезно, также повторюсь, что еще нужно прочитать две статьи, упомянутые в самом начале, постарался по минимуму с ними пересекаться, там очень много полезного 🙂 Они мне очень пригодились, когда я готовился)

    Reply
  74. Denis S

    Большое спасибо! Все четко и по делу!

    Reply
  75. f333

    Добрый день.

    С появлением объектной модели запроса в 8.3.5 условие можно будет добавлять безопаснее:

    Если ЗначениеЗаполнено(Номенклатура) Тогда

    Запрос1.Отбор.Добавить(«Номенклатура = &Номенклатура»);

    Запрос.УстановитьПараметр(«Номенклатура», Номенклатура);

    КонецЕсли;

    расскажите пожалуйста подробнее про объектную модель запроса

    на 8.3.5 не нашел у запроса свойства «отбор»

    вот тут прочитал про объектную модель схемы запроса http://v8.1c.ru/o7/201401query/index.htm

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

    Reply
  76. hame1e00n

    (76) f333, я не использовал.

    Про объектную модель добавил в публикацию информацию, которая была приведена yukon.

    Reply
  77. NittenRenegade

    Подскажите пожалуйста, в какой из задач необходимо использовать признак учета субконто?

    Reply
  78. van2

    Полезно) Надеюсь, на «отлично» сдали?)

    Reply
  79. hame1e00n

    (79) van2, к сожалению не сказали оценку

    Reply
  80. luxnlex

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

    Reply
  81. hame1e00n

    (81) luxnlex, успехов в подготовке!

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

    Reply
  82. its_valera

    Спасибо за проделанный труд! прям вовремя! )

    Reply
  83. Isperator

    Спасибо за наставление. Готовлюсь к платформе.

    Reply
  84. NcSteel

    Начал готовиться к спецу, прочитал статьи и комментарии и прифигел от количества заблуждений, вот некоторые:

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

    Само требование ересь, особенно если знать как устроены регистры сведений.

    (17) Это абсолютная глупость из-за которой возникают лишние блокировки. За это целесообразно 0,5 бала снимать сразу. Я бы вообще выгонял бы с экзамена.

    (25) Если бы ты не добавил слово «Имхо», то лежал бы я под столом. Ладно еще познаешь дзен ).

    Движения.НазваниеРегистра.Очистить(); — это лишнее.

    (30) Мда…. верх заблуждения. Ставим мы БлокироватьДляИзменения или не ставим система заблокирует записи в любом случае. БлокироватьДляИзменения это не управляемая блокировка это другое ). Данное свойство необходимо только при использовании разделителей.

    Reply
  85. Sibiryak
    При формировании движений документа по регистру в самом начале процедуры обработки проведения необходимо очищать движения текущего документа по регистру.

    Но я везде просто указывал сразу конструкцию из этих трех строчек:

    Движения.НазваниеРегистра.Записывать = Истина;

    Движения.НазваниеРегистра.Очистить();

    Движения.НазваниеРегистра.Записать();

    Именно в этом месте движения очищаются одной строкой:

    Движения.НазваниеРегистра.Записать();

    Строка «Движения.НазваниеРегистра.Записывать = Истина;» к очистке записей вообще никакого отношения не имеет.

    Reply
  86. hame1e00n

    (88) Sibiryak,

    Я и не писал, что это делает конкретно эта строка.

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

    Каждая из них несет свой смысл.

    Да, в публикации подробнее описал зачем нужны две другие строки, но это не делает эту ненужной.

    Reply
  87. Sibiryak

    Во-первых, статью считаю полезной (с учетом комментариев). Плюсанул.

    Во-вторых,

    (89)

    Цитата из текста публицации:

    При формировании движений документа по регистру в самом начале процедуры обработки проведения необходимо очищать движения текущего документа по регистру.

    Код такой:

    Движения.НазваниеРегистра.Записывать = Истина;

    Движения.НазваниеРегистра.Очистить();

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

    Reply
  88. Sibiryak
    Возможно, что в процессе проведения нужно будет анализировать записи по этому регистру.

    Так вот, чтобы при анализе текущие записи (старые, до изменения документа) точно не попали в выборку, к приведенным двум строчкам можно добавить еще одну:

    Движения.НазваниеРегистра.Записать();

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

    >можно добавить еще одну: Движения.НазваниеРегистра.Записать();

    Не можно, а нужно.

    >Или же при анализе записей явно указывать границу, не включающую момент времени текущего документа.

    Это получение остатка на момент времени документа, объект «Граница» можно не использовать.

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

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

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

    Движения.НазваниеРегистра.Очистить(); // эта строка нужна, если движения были считаны из БД.
    Движения.НазваниеРегистра.Записать();
    Reply
  89. lisrws

    В 21 посте, если я правильно понял, имелось ввиду свойство дока, которое я отметил на скрине.

    сам давно экзамен сдавал, если не сложно, проясни разницу между включением этого свойства и строками:

    Движения.НазваниеРегистра.Записывать = Истина;

    Движения.НазваниеРегистра.Очистить();

    Движения.НазваниеРегистра.Записать();

    А то методики они новые требуют. понапридумывали, что сами путаются… релизы без косяков делать бы научились сперва

    Reply
  90. skalex

    Здравствуйте.

    Поддержу вопрос, заданный в предыдущем посте. Очень интересно свойство документа «Удаление движения», а именно поведение документа при различных его значениях и необходимость использования описанных выше трех строк. Если не сложно дайте, пожалуйста, развернутый ответ.

    И еще один вопрос, по поводу трех строк. На сколько, всё-таки, уместна строчка:

    Движения.НазваниеРегистра.Очистить();

    Легко проверить, что при использовании следующей записи:

    Движения.НазваниеРегистра.Записывать = Истина;
    Движения.НазваниеРегистра.Записать();

    Результат будет абсолютно идентичный записи:

    Движения.НазваниеРегистра.Записывать = Истина;
    Движения.НазваниеРегистра.Очистить();
    Движения.НазваниеРегистра.Записать();

    Про то, что указанные куски кода аналогичны, и запись Очистить() лишняя, написано много (при желании легко найти данную информацию). Может быть, данная строка используется для некой оптимизации? Т.е. при ее использовании повышается скорость записи или же мы получаем другие не очевидные плюсы? Просьба не оставлять мои вопросы без ответа. Всем заранее спасибо.

    Reply
  91. hame1e00n

    (93) skalex, нет, оптимизация не преследовалась. Принудительно специально очищал движения, так как был замечен следующий баг в платформе — в толстом клиенте без предварительной очистки движений они добавлялись к уже существующим, то есть дублировались. Чтобы не столкнуться с этой ситуацией (ведь заранее неизвестно в толстым или тонком клиенте будет запускать конфигурацию проверяющий) и была добавлена эта строчка. В режиме тонкого клиента, как вы и заметили, при перепроведении старые движения очищались корректно. Как сейчас обстоят дела с этим, не знаю. Возможно, что и в толстым клиенте таких проблем нет, тогда эту строчку действительно можно не использовать.

    Reply
  92. Kolyasik

    Оперативное проведение документов: Зачем устанавливать в приходной и расходной накладной если явно не указано в задаче?

    Reply
  93. egoel

    Здравствуйте! Хочу сдать экзамен на Профессионала. Посоветуйте, с чего начать?

    Reply
  94. lisrws

    (96) день добрый. найдите в сети вопросы к этому экзамену и прорешайте их. это будет надежней всего.

    Reply
  95. jobkostya1c8

    (66)

    Дорогое это удовольствие курсы. Максимум, можно веб-курс за 2100р. позволить (чего я по ЗУП 3.1 и сделал).

    Платформу 8 сдавал в 2009. Там пять билетов «бумажных» было и 4 часа.

    Reply
  96. evorle145

    (8) в 8.0 вроде бы не было свойства «Удалять автоматически при отмене проведения», поэтому после записи котролировать остатки было плохо с точки зрения производительности.

    Reply
  97. Quasar

    (76) Лучше поздно, чем никогда))

    // Создаем объект Запрос.
    Запрос = Новый Запрос;
    Запрос.Текст = «…»;
    
    // Создаем объект Схему запроса и устанавливаем текст запроса.
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
    // Добавляем отбор в первый запрос пакета.
    ОператорыЗапроса = СхемаЗапроса.ПакетЗапросов[0].Операторы;
    ОператорыЗапроса[0].Отбор.Добавить(«ВсевдонимТаблицы.Номенклатура= &Номенклатура»);
    //Возвращаем итоговый текст запроса.
    Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
    // Устанавливаем значение нового параметра
    Запрос.УстановитьПараметр(«Номенклатура», Номенклатура);
    
    //…
    // Код выполнения запроса и обработки результата

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *