Тестовые вопросы по программированию

1. ogre2007 298 12.09.19 22:06 Сейчас в теме
Доброго времени суток коллеги. Дали мне тут пару заданий на профпригодность. Прошу оценить и предложить варианты решений. Спасибо.

Задание 1.
Есть Дополнительный реквизит справочника партнеры, Нужно ограничить доступ к нему. Определенным пользователям. Справочник "партнеры" с поддержки снимать нельзя, форму элемента тоже. Сделать на демо базе.


Задание 2.
Надо перезаписать, просто вызвать справочник объект.записать(), для 36 000 элементов справочника, но при этом в базе работают 200 пользователей, напишите обработку, которая минимально осложнит работу пользователей во время перезаписи справочника.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
98. ogre2007 298 16.09.19 16:19 Сейчас в теме
Все. Всем спасибо за участие. Тестирующий забраковал оба моих решения, сказали "совсем мимо". Как нужно было я наверное уже не узнаю. Пойду учиться дальше :) Вознаграждение самым активным.
user811769; +1 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
7. VmvLer 13.09.19 09:31 Сейчас в теме
(1) а когда вас примут на работу, то по каждой задачке тоже будет на инфостар бегать.

вот мне интересно как бы решали задачу ну допустим 1.
можно без кода - просто порассуждать.

часто код не нужен чтобы понять профпригоден или нет?
20. ogre2007 298 13.09.19 11:15 Сейчас в теме
Спасибо за ответы.

(7) Если вопросы будут интересные или у меня будут сомнения по варианту решения, то почему бы и нет. Главное чтобы коммерческая тайна не пострадала)

(4) Имелось ввиду оценить по шкале "интересно" - "не интересно". Ваша оценка в деньгах тоже интересна, посмеялся, спасибо.

Теперь по сути задач.
Задача 1. Тут уже озвучили, тоже склоняюсь к подписке на события. "ПередЗаписью" проверять изменение этого доп. реквизита нужной группой пользователей.
Задача 2. Смущает "осложнит работу пользователей". Имеется ввиду блокировка объектов, или нагрузка на сервер, или что-то еще? Блокировка скорее нам осложнит задачу а не пользователям. Если проблема в нагрузке, тогда делать порциями, хз как, еще не смотрел. Но действительно проще сделать регламентом, когда никого не будет в базе.
22. uno-c 235 13.09.19 11:28 Сейчас в теме
(20)Если пользователь начал редактировать объект (элемент справочника), а обработка его перезапишет - то это проблема для пользователя на мой взгляд - потерянное время пользователя. Поэтому попытка заблокировать объект из обработки перед перезаписью и отказ от записи, если попытка не удалась - минимизирует данную проблему (т.е. отложить запись на будущее - после разблокировки пользователем). То, что блокировка осложнит нам задачу - не противоречит тестовому заданию. В приоритете проблемы пользователя.
38. shatunovs 13.09.19 17:34 Сейчас в теме
(1)
Задание 1
Есть мысль смотреть в сторону RLS
40. shatunovs 13.09.19 17:41 Сейчас в теме
(1)
Надо перезаписать, просто вызвать справочник объект.записать()

Во-первых, выбрать-выгрузить ссылки в массив. Во-вторых, бегать циклом по всему массиву, получая объект, устанавливая блокировку и пытаясь записать. Если облом - идем дальше. Если ОК - удаляем из массива. Это обернуть вторым циклом до полного удовлетворения, сиречь, опустошения массива номенклатурин. Между циклами перебора массива можно воткнуть задержку на несколько секунд, чтобы когда в нем останется мало, но занятых пользователями записей, не пинать их много-много раз за секунду.
61. spacecraft 14.09.19 17:09 Сейчас в теме
(1) по первому заданию (условимся, что это типовая на БСП) получать в расширение Формы нет смысла. Заполнение происходит не в модуле формы.
Учитывая, что в задании указано просто "ограничить доступ", намекает, что ограничение нужно не только на запись, а и на чтение. Так что подписку на событие записи так же отметаем.
Наиболее приемлемым видится путь изменения общего модуля "УправлениеСвойствамиПереопределяемый" и конкретно функции "ЗаполнитьНаборыСвойствОбъекта".
Общий переопределяемый модуль как раз намекает, что мы можем его в него вклиниться, без ущерба основной логики.
triviumfan; +1 Ответить
65. uno-c 235 14.09.19 17:27 Сейчас в теме
(61)Похоже большинство участников обсуждения - за то, чтобы ограничить и запись и чтение доп.реквизита. Если так - то я согласен с большинством.
93. Indgo 338 16.09.19 12:53 Сейчас в теме
(1)
Есть Дополнительный реквизит справочника партнеры, Нужно ограничить доступ к нему. Определенным пользователям. Справочник "партнеры" с поддержки снимать нельзя, форму элемента тоже. Сделать на демо базе.

1. Нужно вставить расширение и установить проверку доступа в модуле Справочника. ПередЗаписью.
2. Я конечно знаю что вы там скажите: надо Повесить Подписку на событие "передЗаписью" итп - в итоге эти все события начнут так тормозить вместе с RLS - мало не покажется. Так что события в топку.. Настоящий программист такой халтурой не занимается..

Надо перезаписать, просто вызвать справочник объект.записать(), для 36 000 элементов справочника, но при этом в базе работают 200 пользователей, напишите обработку, которая минимально осложнит работу пользователей во время перезаписи справочника.

Если просто переалить - то лучше сделать загрузку реквизита через XML файл. ("УниверсальнаяЗагрузкаиВызрузкаОбъектов83"). Тогда
1. не будут выполняться никакие тригеры и события
2. Не будет блокировок.
3. Все зальется за 15 секунд. Ваши 200-1000 пользователей - даже об этом не поймут.
4. Правда существуют риски получить с битыми ссылками - надо много думать.
94. triviumfan 93 16.09.19 13:57 Сейчас в теме +0.5 $m
(93)
Если просто переалить - то лучше сделать загрузку реквизита через XML файл.

Такими темпами сейчас умельцы начнут предлагать прямо в субд апдейт делать, за 1 секунду :)
Indgo; nomad_irk; +2 Ответить
95. Indgo 338 16.09.19 14:13 Сейчас в теме
(94)
Такими темпами сейчас умельцы начнут предлагать прямо в субд апдейт делать, за 1 секунду :)

Скулем так вообще красота - если руки растут откуда надо. Только 1С это не одобряет на лицензионном уровне.
104. DrZombi 286 18.09.19 06:53 Сейчас в теме
(1) Используй расширение. Нарисуй свой набор прав
2. Timur.V 78 12.09.19 22:43 Сейчас в теме
Вопрос на сообразительность:
Нужно бухгалтеру распределить сумму 10000 руб на бригаду из 7 человек поровну.
Напишите цифры от 1 до 7 (это работники) и рядом укажите сумму, которую получит каждый работник.
3. user856012 13 13.09.19 01:08 Сейчас в теме
(2)
Напишите цифры от 1 до 7 (это работники) и рядом укажите сумму, которую получит каждый работник.
Элементарно:
1 - 2 $m
2 - 2 $m
3 - 2 $m
4 - 2 $m
5 - 2 $m
6 - 2 $m
7 - 2 $m
я - 10000 руб. (поощрение себе, любимому, за сообразительность)
4. succub1_5 88 13.09.19 08:14 Сейчас в теме
"Прошу оценить и предложить варианты решений."
Пожалуйста - оценка:
1 за 4 часа - 5000 р.
2 за 15 минут - 1500 р.
а вот другие варианты решения:
1 за 30 минут - 10000 р. 2 за 1 час - 1000р. или 1 за 3 часа за 6000р и 2 за 5 минут за 7500 р.
могу еще предложить кучу вариантов
5. user_2010 873 13.09.19 08:18 Сейчас в теме
Задание 1 сделать через расширение?
6. starjevschik 13.09.19 09:18 Сейчас в теме
1 расширение сделать, полчаса
2 если это серверная база с управляемыми формами, то можно фоновое задание смастерить. Иначе - сделать вечером, когда все уйдут. Второй вариант - полчаса, первый - ? зависит от познаний в организации этого процесса в 1с.
9. Sapiens_bru 4 13.09.19 10:02 Сейчас в теме
(6)
если это серверная база

Если это файловая база на 200 активных пользователей... я бы хотел на неё посмотреть
10. starjevschik 13.09.19 10:04 Сейчас в теме
(9) в условии задачи ничего об этом не сказано. Будет немного странновато предложить решение, которое для этой базы в принципе не подходит.
12. Sapiens_bru 4 13.09.19 10:36 Сейчас в теме
(10) В условии сказано
"напишите обработку, которая минимально осложнит работу пользователей во время перезаписи справочника"
На файловой базе это не реализуемо. Так как на файловой базе исключительная блокировка при записи устанавливается на таблицу в целом.
Немного странновато это файловая база на 200 пользователей
11. uno-c 235 13.09.19 10:10 Сейчас в теме
В первом задании видимо подсказка, "форму элемента тоже" - поскольку если справочник нельзя снимать с поддержки, то как следствие и форма элемента не снимется. Т.е. нужно в расширении доработать форму элемента, и, видимо, роль добавить, чтоб программно по роли прятать заданный доп.реквизит.

Второе делать в фоне, можно порциями с паузами, с предварительной попыткой заблокировать каждый объект, чтобы если пользователь начал редактировать - то не перезаписывать этот объект - а откладывать на попозже. Ссылки на отложенные для перезаписи объекты где-нибудь сохранять и пробовать перезаписать позже, когда объект освободится.
13. Sapiens_bru 4 13.09.19 10:42 Сейчас в теме
(11) Первое можно ещё и подпиской сделать.
14. uno-c 235 13.09.19 10:49 Сейчас в теме
(13)Имеете в виду - про запрет снятия с поддержки написано только про справочник Партнеры? Тестирующий, наверно, не одобрит )
16. Sapiens_bru 4 13.09.19 10:50 Сейчас в теме
(14) "Справочник "партнеры" с поддержки снимать нельзя"
23. uno-c 235 13.09.19 12:19 Сейчас в теме
(16)
"Справочник "партнеры" с поддержки снимать нельзя"
А если максимизировать буквальный подход к тексту задания, то стоит отметить, что "Объект поставщика редактируется с сохранением поддержки" и "Объект поставщика снят с поддержки" - это разные категории, т.е. задание не запрещает вмешиваться в саму конфигурацию, можно обойтись вообще без расширения - оставить "... с сохранением поддержки" и спокойно редактировать все что нужно.
15. nomad_irk 71 13.09.19 10:49 Сейчас в теме
(13) А можно увидеть последовательность действий для реализации ограничения доступа подпиской?
17. uno-c 235 13.09.19 10:55 Сейчас в теме
(15)Кстати, да, Sapiens_bru, можете пояснить Вашу идею с подпиской? Несмотря на подкол тестирующего, грозящий завалом теста, интересно что Вы имели в виду.
18. Sapiens_bru 4 13.09.19 11:03 Сейчас в теме
(15) Видимо я не понял что есть "ограничить доступ". Не видят и не меняют - только танцы с бубном вокруг формы. Видят но не меняют - можно подпиской
Как при втором подходе сделать ограничение написал в личку, хотя наверное зря. Речь в задаче скорее о первом
19. uno-c 235 13.09.19 11:06 Сейчас в теме
(18)Ясно. Вы просто поняли по-своему. Верно или неверно - это вопрос к тестирующему и его формулировке задачи. Если нужно ограничить только запись - то действительно, можно через подписку.
21. uno-c 235 13.09.19 11:21 Сейчас в теме
(18)
Речь в задаче скорее о первом
Да, вариант с подпиской уж слишком буквоедский получается. Про запрет снятия с поддержки справочника "Партнеры" написали, про остальное ни слова? Про ограничение доступа сказали, но не детализировали? Так получите же подписку - снятие с поддержки другого объекта конфигурации и ограничение доступа на запись, но не на чтение. Да Вы шутник, батенька )
37. shatunovs 13.09.19 17:32 Сейчас в теме
(11)
доработать форму элемента
А можно прицепиться расширением к общему модулю, где формируются элементы управления по доп. реквизитам. Форму в расширение тащить, думаю, хуже будет
24. vadim1011985 99 13.09.19 14:54 Сейчас в теме
Первую задачу вообще можно решить не прибегая к программированию
41. uno-c 235 13.09.19 17:56 Сейчас в теме
(24)В заголовке темы автор написал: "Тестовые вопросы по программированию". Как же можно программировать, не прибегая к программированию? )
25. vadim1011985 99 13.09.19 15:04 Сейчас в теме
Решение 1 задачи

достаточно в форме настройки дополнительных реквизитов и сведений настроить условия Доступности(видимости) данного реквизита. В дааном случае нам подойдет по группе доступа (в БП 3.0 профили групп ) .
Прикрепленные файлы:
user811769; kraynev-navi; Ганс; UtSpar; Bene_Valete; uno-c; sommid; user_2010; EVKash; vv2; +10 Ответить
26. user_2010 873 13.09.19 15:36 Сейчас в теме
(25) круто! не знала о такой возможности!
27. vadim1011985 99 13.09.19 15:53 Сейчас в теме
(26) большинство настроек делается из-за незнания типовых механизмов. И как пример первый вопрос , большая часть решили дорабатывать конфу , и думаю, ни один не залез посмотреть что можно настроить у доп. Реквизита . Я думаю как раз на это и направлен первый вопрос
GROOVY; Bene_Valete; +2 Ответить
28. user_2010 873 13.09.19 16:00 Сейчас в теме
43. uno-c 235 13.09.19 18:14 Сейчас в теме
(28)А зря Вы так быстро согласились. Вот я бы сказал - большинство не проверило предложенное "решение без программирования", а начали спорить про наличие/отсутствие БСП. А по факту - предложение без программирования не подходит даже при наличии БСП. Согласны? )
48. Sashares 34 13.09.19 18:49 Сейчас в теме
(43)
А по факту - предложение без программирования не подходит даже при наличии БСП.

Что за бред вы несете?
Вместо того, чтобы воспользоваться существующим механизмом ограничения прав, изобретать собственный велосипед - кому нужны такие неадекваты?
49. uno-c 235 13.09.19 18:51 Сейчас в теме
(48)Вы хоть проверьте сначала предложенное решение задачи №1 без программирования, прежде чем определение давать, а потом ответьте себе, кто из нас с Вами неадекват ) По факту - предложенное решение без программирования не решает поставленную задачу.
50. Sashares 34 13.09.19 18:54 Сейчас в теме
(49)У меня нет под рукой УТ, чтоб проверять.
Если задача решается административными средствами, стандартным механизмом, ее нужно решать именно так.
51. uno-c 235 13.09.19 18:58 Сейчас в теме
(50)Я написал, что предложенное решение без программирования от vadim1011985 не решает поставленную задачу, предварительно проверив. Если Вы бросаетесь резкими словами, даже не проверяя - то Ваше категоричное "Что за бред вы несете?" - относится к Вам самому.
58. uno-c 235 14.09.19 14:35 Сейчас в теме
(50)Sashares, не увидев извинений с Вашей стороны - дам Вам совет: не являйте миру свой интеллект в столь резких выражениях в отношении собеседников, как "бред, неадекват". Если понимания Вам не хватает - следите за общением толковых людей, и обратите внимание на сообщение vadim1011985 №54 в этой ветке.(54)
29. Sashares 34 13.09.19 16:08 Сейчас в теме
(27) ТС не указал по какой конфигурации вопросы, вообще не факт, что там есть БСП, так то.
Но конечно, если речь про доп. реквизиты, логично предположить, что БСП там таки есть.
30. vadim1011985 99 13.09.19 16:12 Сейчас в теме
(29) можно предложить несколько вариантов решений. с учетом разных ситуаций. Но если явно не указано то считаем что есть.
31. nomad_irk 71 13.09.19 17:01 Сейчас в теме
(30)скорее, нужно считать, что нет. Если есть условия, напрямую влияющие на результат, их обычно озвучивают сразу.
32. vadim1011985 99 13.09.19 17:12 Сейчас в теме
(31) Ну не совсем. Даже в НК написан по принципу "Если явно не указано , то разрешено/запрещено" Соответственно в задаче не сказано что это ОФ - значит можно считать что это УФ , не сказано конфигурация типовая или самописная - считаем что типовая , не сказано используется БСП или нет - считаем используется. - отсюда такой вариант решения

P.S точнее в вопросе есть приписка сделать это в демо-базе . ТС не указал что это за демо база . А без этого трудно сказать что есть , а чего нет. Или может сам ТС может выбрать демо-базу по своему усмотрению
33. nomad_irk 71 13.09.19 17:20 Сейчас в теме
Да кто вам такое сказал, что это УФ/Типовая конфа/Бсп? :)
это вы предположили из-за простоты решения поставленной задачи при этих условиях.....
34. vadim1011985 99 13.09.19 17:23 Сейчас в теме
(33) а кто вам сказал что этого нет ?
46. uno-c 235 13.09.19 18:32 Сейчас в теме
(34)vadim, Вы поняли ошибку в Вашем предложении без программирования?
52. vadim1011985 99 13.09.19 19:23 Сейчас в теме
Надо признать , что в словах uno-c есть изрядная доля правды , так как действительно в предложенном мной варианте мы привязываемся к реквизиту самого справочника партнеры. а не к справочнику пользователи или конкретному пользователю С одной стороны мы можем создать отдельную группу (группы) доступа и назначить их для партнеров что правильно работало ограничение , но с другой стороны для надежного закрытия нужно прогить
53. uno-c 235 13.09.19 19:29 Сейчас в теме
(52)Ограничение должно работать не для партнера в целом, а для отдельного доп.реквизита. Вам не поможет создание отдельной группы доступа для того, чтобы у одних пользователей доп.реквизит был доступен, а для других - недоступен. Т.е. типовыми средствами через доступность доп.реквизита вообще не решить поставленную задачу.
vadim1011985; +1 Ответить
54. vadim1011985 99 13.09.19 19:31 Сейчас в теме
(53) Да точно , согласен мое решение не верно
55. uno-c 235 13.09.19 19:48 Сейчас в теме
(54)
Надо признать , что в словах uno-c есть изрядная доля правды
Итого, изрядная доля правды приравнялась к 100% )
44. nomad_irk 71 13.09.19 18:20 Сейчас в теме
(29)да кто вам такое сказал? В УТ10.3 тоже есть доп реквизиты, однако БСП там если и есть, то она не умеет огранияивать доп реквизиты.
45. uno-c 235 13.09.19 18:21 Сейчас в теме
(44)Даже ограничение доступности доп.реквизита в зависимости от значения реквизита "Группа доступа" не решит поставленную задачу. Т.е. предложение без программирования неверно, независимо от наличия БСП.
ogre2007; +1 Ответить
42. uno-c 235 13.09.19 18:07 Сейчас в теме
(25)Группа доступа - это реквизит справочника Партнеры. А ограничивать нужно в зависимости от пользователя, а не от значения какого-то реквизита конкретного Партнера. Ваше решение - это не решение обозначенной задачи. Т.е. если у элемента - Партнера будет неподходящая группа доступа - доп.реквизит не будет доступен никому.
35. nomad_irk 71 13.09.19 17:26 Сейчас в теме
Ну так я о том и сказал выше, что если не указано дополнительно, то изначально нужно рассматривать некий общий способ решения. Если появятся уточнения, напрямую влияющие на решение, то и решение может измениться в сторону частного.
36. vadim1011985 99 13.09.19 17:29 Сейчас в теме
(35) Я тоже выше сказал , что можно предложить несколько вариантов решения.

Вообще я считаю, что данные спор бессмысленный , без уточнения ТС на счет демо-базы и прочих условий
Sashares; +1 Ответить
39. Sashares 34 13.09.19 17:39 Сейчас в теме +0.5 $m
(36)Поддерживаю. Вся тема бессмысленна. ТС троль.
nomad_irk; +1 Ответить
47. ogre2007 298 13.09.19 18:44 Сейчас в теме
Конфигурация 1С:Управление торговлей 11
56. triviumfan 93 14.09.19 09:25 Сейчас в теме
1. Предполагаю, что делается это ограничение в общем модуле СобытияФорм или СобытияФормПереопределямый или как-то так. Наверное, от УТ зависит.
Скорее всего сначала идёт инициализация переменных формы для кеширования и работы с доп реквизитами, а потом уже переопределение формы.
Полагаю, чтобы ограничить доступ к конкретному доп реквизиту нужно просто удалить его из кеша/реквизита формы. Но это лишь размышления, надо проверять.
2. Сомневаюсь, что перезапись 36к элементов осложнит работу пользователей. Может речь и правда про попытку заблокировать объект перед записью... чтобы не было предупреждения об изменении версии объектов или какую там ошибку платформа выдаёт.... типа "данные были изменены.." или что-то похожее. А, ещё, может быть, косвенно речь про отключение проверок и действий перед записью (Объект.ОбменДанными.Загрузка = Истина), кто знает, сколько там всего...
57. ogre2007 298 14.09.19 11:55 Сейчас в теме
Решил первую задачку. Можно конечно по разному трактовать "ограничить доступ". Я остановился на варианте, что программа выдает ошибку при его изменении.
Сделал подписку на событие "ПередЗаписью". В обработчике такая процедура:
Процедура ПроверитьДосутДопРеквизит(Источник, Отказ) экспорт
	
	//Наименование доп реквизита у справочника партнеры "ИзбранныйРеквизит"
	//Разрешено менять реквизит группе пользователей "ИзбранныеПользователи"
	
	ЗапретитьИзменятьДопРеквизит = Истина;
	
	//смотрим какое значение пытаются сохранить
	ЗначениеРеквизитаНовое = "";
	Для каждого стр из Источник.ДополнительныеРеквизиты цикл
		если стр.Свойство.Заголовок = "ИзбранныйРеквизит" тогда
			ЗначениеРеквизитаНовое = стр.Значение;	
		конецесли
	конеццикла;
	
	//смотрим какое значение было до изменений
	ЗначениеРеквизитаСтарое = "";
	Для каждого стр из Источник.Ссылка.ДополнительныеРеквизиты цикл
		если стр.Свойство.Заголовок = "ИзбранныйРеквизит" тогда
			ЗначениеРеквизитаСтарое = стр.Значение;	
		конецесли
	конеццикла;
	
	если ЗначениеРеквизитаНовое <> ЗначениеРеквизитаСтарое тогда
		
		// проверяем что пользователь входит в нужную группу
		ТекПользователь = ПараметрыСеанса.ТекущийПользователь;
		ЗапросПраваПользователя = новый Запрос;
		ЗапросПраваПользователя.УстановитьПараметр("НаименованиеГруппыДоступа","ИзбранныеПользователи");
		ЗапросПраваПользователя.УстановитьПараметр("Пользователь",ТекПользователь);
		ЗапросПраваПользователя.Текст = "ВЫБРАТЬ
		                                |	ГруппыДоступаПользователи.Пользователь
		                                |ИЗ
		                                |	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
		                                |ГДЕ
		                                |	ГруппыДоступаПользователи.Ссылка.Наименование = &НаименованиеГруппыДоступа
		                                |	И ГруппыДоступаПользователи.Пользователь = &Пользователь";
		ВыборкаПользователей = ЗапросПраваПользователя.Выполнить().Выбрать();
		Если ВыборкаПользователей.Следующий() тогда
			ЗапретитьИзменятьДопРеквизит = Ложь;
		иначе
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Вы не можете изменить реквизит 'ИзбранныйРеквизит', обратитесь к Администратору.");
		КонецЕсли;
	КонецЕсли;
	
	Отказ = ЗапретитьИзменятьДопРеквизит; 		
			
КонецПроцедуры
Показать
59. uno-c 235 14.09.19 15:37 Сейчас в теме
(57)Таким образом, Вы включили возможность изменения конфигурации? Если так - прошу сообщить, как тестирующий отреагировал на такое Ваше решение. И ограничить доступ - не самая общепринятая трактовка: если набрать в Яндексе "ограничить доступ" - то вся первая страница на тему "совсем закрыть, чтоб не видели".
60. triviumfan 93 14.09.19 16:35 Сейчас в теме
(59) Согласен, ограничить доступ - либо скрыть видимость либо убрать возможность изменения (как минимум интерактивного и как максимум + любого). Полагаю нужно как минимум удалить элемент формы этого реквизита.
А причем тут возможность внесения? Ведь указано, что партнеры на полной поддержке, а не конфа)
62. uno-c 235 14.09.19 17:14 Сейчас в теме
(60)
Ведь указано, что партнеры на полной поддержке, а не конфа)
Да-да, я уже оценил этот прикол, вопрос как к нему отнесется тестирующий, а они ведь всякие бывают.И партнеры тоже по тексту задания - не на полной поддержке, а "с поддержки снимать нельзя". В конфигураторе разные опции "Объект поставщика редактируется с сохранением поддержки" и "Объект поставщика снят с поддержки", т.е. под текст задания если читать буквально - подойдет и редактирование модулей самого справочника, ведь поддержка сохранена ).
63. triviumfan 93 14.09.19 17:17 Сейчас в теме
(62) Где траву берёшь? С такой логикой далеко не пойдёшь.
64. uno-c 235 14.09.19 17:19 Сейчас в теме
(63)Разумеется, это была шутка. Но доля правды в ней то, что корректней писать не "с поддержки снимать нельзя", правильнее будет "включать возможность редактирования нельзя". Я привык писать ТЗ предельно четко, таких вольностей, как в топике обычно себе не позволяю, разве что проверить, что тебя понимают с полуслова. И в данном задании мне кажется, что раз нельзя снимать с поддержки справочник, то и всю конфу нужно оставить в покое.
66. triviumfan 93 15.09.19 12:24 Сейчас в теме
Я вот так первую решил:
МодификацияКонфигурацииПереопределяемый.ПриСозданииФормы:
//++
Если Форма.ИмяФормы = "Справочник.Партнеры.Форма.ФормаЭлемента" Тогда
	
	УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(Форма); // по умолчанию заполнение отложенное, вызовем принудительно
	
	Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда // тут какое-либо условие
		
		ЗапрещенноеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "_ТестовыйРеквизит");
		НайденныеСтроки = Форма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новый Структура("Свойство", ЗапрещенноеСвойство));
		Если НайденныеСтроки.Количество() Тогда
			СтрокаОписания = НайденныеСтроки.Получить(0);
			Форма.Элементы.Удалить(Форма.Элементы[СтрокаОписания.ИмяРеквизитаЗначение]);
			Форма.Свойства_ОписаниеДополнительныхРеквизитов.Удалить(СтрокаОписания);
		КонецЕсли;
		
	КонецЕсли;
	
КонецЕсли;
//--
Показать
Прикрепленные файлы:
67. ogre2007 298 15.09.19 16:02 Сейчас в теме
Решил вторую задачу. Посчитал, что наиболее феншуйно сделать ее в фоне. Автор задачи намекал на ресурсоемкость. Дополнительно обработку можно запустить по расписанию. Откладывание заблокированных элементов на последующую перезапись решил не делать, думаю не в этом была задача. Перебор сделал максимально просто:
ВыборкаЭлементовСправочника = Справочники.Номенклатура.ВыбратьИерархически();
	пока ВыборкаЭлементовСправочника.Следующий() цикл		
		если не ВыборкаЭлементовСправочника.ЭтоГруппа тогда
			ОбСпр = ВыборкаЭлементовСправочника.ПолучитьОбъект();
			//ОбСпр.Описание = "тест";
			попытка
				ОбСпр.Записать();
			исключение
				//отложить элементы которые не удалось записать, например во внешний файл
			конецпопытки;
		конецесли;		
	конеццикла;
Показать
Прикрепленные файлы:
ПерезаписьСправочника.epf
68. uno-c 235 15.09.19 17:37 Сейчас в теме
(67)И как это решение "минимально осложнит работу пользователей" ? Пользователь начал редактировать партнера, десяток минут пыхтел-старался, а ему при записи - на тебе - "элемент изменен другим пользователем, запись невозможна".
69. ogre2007 298 15.09.19 18:32 Сейчас в теме
(68)Ошибаетесь. Не будет такой ситуации. Проверил.
70. triviumfan 93 15.09.19 21:39 Сейчас в теме
(69)
Не будет такой ситуации. Проверил.
Странно. А как проверяли? Пытались записать уже измененный объект?
71. triviumfan 93 15.09.19 23:28 Сейчас в теме
(69) Только что проверил - такая ошибка будет. Вы даже элементарный пример воспроизвести не можете. Похоже, что вам нужно искать другую вакансию :)
Прикрепленные файлы:
75. ogre2007 298 16.09.19 08:42 Сейчас в теме
В условии этой задачи нет указания справочника. Для примера взял "номенклатуру".

(71) Может отличается среда выполнения. У себя попробовал и с открытым элементом, и с изменным - ошибок не было. Пользовательские изменения просто перезаписывали изменения обработки.

(73) "Запросы insert в цикле." как сделали бы вы? Можно еще было запросом, это вы имеете ввиду?
76. spacecraft 16.09.19 08:53 Сейчас в теме
(75)
"Запросы insert в цикле." как сделали бы вы? Можно еще было запросом, это вы имеете ввиду?

Получить ссылки на элементы и разбить по нескольким массивам. Выполнять в разных потоках. Получение объектов и запись выполнять порциями в единой транзакции.
Количество потоков и порции для транзакции подбирать исходя из возможностей сервера и его нагруженности.
При ошибках транзакции переносить ссылки незаписанных элементов в отдельный массив. По окончанию основной работы пытаться повторно записать уже с другими порциями.
Ссылки на элементы получать конечно же запросом без иерархии и групп. Зачем нам нужна иерархия и группы?
79. triviumfan 93 16.09.19 09:19 Сейчас в теме
(76)
Получить ссылки на элементы и разбить по нескольким массивам. Выполнять в разных потоках. Получение объектов и запись выполнять порциями в единой транзакции.
Количество потоков и порции для транзакции подбирать исходя из возможностей сервера и его нагруженности.

Так это же наоборот повысит нагрузку, а в задании указано сделать наоборот)
Правильно предлагали блокировку накладывать перед записью - вот основной посыл решения.
80. spacecraft 16.09.19 09:27 Сейчас в теме
(79) не надо путать наименьшую нагрузку своего кода и "напишите обработку, которая минимально осложнит работу пользователей во время перезаписи справочника"
Если мы будем делать запись в едином потоке и получать с последующей записью без порций и последовательно дергать сервер для записи, тогда только усложним работу пользователям.
И что имеется ввиду под фразой: "Правильно предлагали блокировку накладывать перед записью - вот основной посыл решения."? Это как?
81. triviumfan 93 16.09.19 09:37 Сейчас в теме
(80) Вы на продакшне используете многопоточные обработки данных в пик нагрузки, днём?

И что имеется ввиду под фразой: "Правильно предлагали блокировку накладывать перед записью - вот основной посыл решения."

https://its.1c.ru/db/v8std#content:490:hdoc
82. spacecraft 16.09.19 09:48 Сейчас в теме
(81) про пик нагрузки днем это уже отсебятина. Вопрос: Загрузить сервер на 10 минут или на 1 минуту это будет являться "минимально осложнит работу пользователей"?
Приведенная ссылка совсем из другой области. Нам не надо ничего изменять в получаемом объекте, а просто записать.
Т.е. код:
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
ФайлОбъект.Заблокировать(); 
ФайлОбъект.Записать();

будет полностью аналогичен этому:
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
ФайлОбъект.Записать();

Это нужно объяснять?
83. triviumfan 93 16.09.19 09:57 Сейчас в теме
(82) Дело не во времени, в описании могли указать 1000 пользователей и 1кк элементов. Дело в подходе реализации таких задач. И многопоточность тут точно только навредит, к гадалке не ходи.

(82)
Это нужно объяснять?
нужно, ибо в первом случае обычно через попытку установки блокировки делается, дабы обработать таку. ситуацию, в нашем случае, допустим, отложить обработку проблемного элемента на потом.
84. spacecraft 16.09.19 10:01 Сейчас в теме
(83) блокировку в примерах по ссылке делают для того, чтобы убедиться, что можем изменить и записать. Иначе смысла что-то изменять нет. Все.
При записи автоматически уже накладывается блокировка. И смысла дополнительно его накладывать нет совсем.
85. triviumfan 93 16.09.19 10:11 Сейчас в теме
(84) вы читали статью.
ЗЫ: в бсп сейчас, кстати, накладывается транзакционная блокировка при обработке данных.
Модуль менеджера объекта ОбработатьДанныеДляПереходаНаНовуюВерсию()
Пока Выборка.Следующий() Цикл
		
		УстановленаБлокировка = Ложь;
		
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяОбъекта);
			ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
			ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
			Блокировка.Заблокировать();
			
			ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
			
			Если ДокументОбъект = Неопределено Тогда
				ОтменитьТранзакцию();
				Продолжить;
			КонецЕсли;
...
Показать
86. spacecraft 16.09.19 10:16 Сейчас в теме
(85) прочтите ее еще раз. Только внимательно смотрите акценты.
Прежде чем изменять существующий объект информационной базы из кода на встроенном языке, следует предварительно его заблокировать

Пример № 1. Требуется заблокировать объект и, если это удалось, модифицировать данные.
87. triviumfan 93 16.09.19 10:26 Сейчас в теме
(86) Не понимаю, что вы хотите сказать. В статье показано, как работать с объектными пессимистическими блокировками, чтобы избежать ситуации, когда данные были кем-то изменены. Из описания указано, что идёт активная работа с БД.
А вы хотите принудительно изменить объект, поменять версию, и все изменения, что делал пользователь отменить.
88. spacecraft 16.09.19 10:28 Сейчас в теме
(87)вот даже не знаю как еще объяснить. Может кто еще более ясно объяснит.
Хорошо, продолжайте думать как хотите.
91. spacecraft 16.09.19 11:07 Сейчас в теме +0.5 $m
(85) вот, кстати, пример из БСП правильный с точки зрения блокировок на чтение и запись. Т.е. и чтение так же попадает в блокировку.
77. spacecraft 16.09.19 09:09 Сейчас в теме
(75)
Может отличается среда выполнения. У себя попробовал и с открытым элементом, и с изменным - ошибок не было. Пользовательские изменения просто перезаписывали изменения обработки.

Что-то не так пробовали.
Открыли элемент справочника в форме и изменили его (можно даже не изменять). Версия элемента "АААА"(псевдо версия)
После этого в фоне произошла перезапись этого же элемента справочника. Версия стала "АВАА"
После этого на форме попытаться записать. Версия не совпадает. Будет выдана ошибка.

Но это не основное в задании. Эту ошибку практически не решить внешней обработкой. При открытии элемента в форме блокировка не накладывается. В УФ после открытия формы элемента даже полученный объект удаляется. Т.е. ничего не связывает форму элемента и запись в SQL.
89. uno-c 235 16.09.19 10:49 Сейчас в теме
(77)
Эту ошибку практически не решить внешней обработкой.
Это как раз частично и решается попыткой блокировки из кода решения задачи. Если пользователь начал редактировать - автоматом установилась пессимистическая блокировка. Эта блокировка не запретит обработке из другого сеанса записать данный элемент, но обломает попытку заблокировать объект из другого сеанса. При неудачной попытке заблокировать - нужно отказаться от записи (несмотря на то, что запись не запрещена, если попытаться записать без СправочникОбъект.Заблокировать() - то все нормально пройдет), отложить этот элемент и вернуться позже.
triviumfan; +1 Ответить
90. spacecraft 16.09.19 10:57 Сейчас в теме
(89) частично соглашусь. В таком ключе не рассматривал.
Но это если пользователь уже начал редактировать.
Если форму еще не изменяли или изменили после перезаписи в другом сеансе, то ошибка никуда не денется.
92. uno-c 235 16.09.19 11:22 Сейчас в теме
(90)
Если форму еще не изменяли
наверно на это в том числе намекает слово "минимально" в задании
...которая минимально осложнит работу пользователей...
- т.е. где есть возможность - там не осложняем работу пользователей.
triviumfan; +1 Ответить
96. uno-c 235 16.09.19 15:18 Сейчас в теме
(90)Если форму элемента открыли, но еще не меняли, затем в другом сеансе обработка перезаписала объект, то в дальнейшем при начале редактирования в открытой форме у меня выдается "Данные были изменены или удалены другим пользователем" - еще одно осложнение пользователя снято.
97. uno-c 235 16.09.19 15:22 Сейчас в теме +0.5 $m
(90)
изменили после перезаписи в другом сеансе
Таким образом, если изменили после перезаписи в другом сеансе - то значит пришлось перечитать сохраненное обработкой, и вообще потерь времени пользователя не будет - т.е. все обозначенные Вами в (90) проблемы пользователя сняты путем попытки заблокировать объект из обработки и отказа от записи, если попытка не увенчалась успехом.
78. triviumfan 93 16.09.19 09:16 Сейчас в теме
(75)
Может отличается среда выполнения. У себя попробовал и с открытым элементом, и с изменным - ошибок не было. Пользовательские изменения просто перезаписывали изменения обработки.

Не может быть. Версии разные, платформа должна была "ругнуться". Даже на файловой такое же поведение.
Открыл карточку, начал редактировать. Далее обновил в другом сеансе (не обязательно фоново). Попытаешься записать в первом сеансе - ошибка "данные были изменены.."
72. uno-c 235 16.09.19 00:29 Сейчас в теме
(69)Не знаю как на самых последних платформах - но до них пессимистическая блокировка не запрещала запись объекта. Т.е. если пользователь начал редактировать партнера, но еще не записал, и в это время из другого сеанса вызвать код записать() данного партнера - то код успешно сработает, а вот пользователю потом придет облом при попытке записи - все изменения пользователю придется переписывать, предварительно обновив данные партнера.
73. spacecraft 16.09.19 07:02 Сейчас в теме
(72) там в (69): "ВыборкаЭлементовСправочника = Справочники.Номенклатура.ВыбратьИерархически();"
По-этому с партнером будет все в порядке :)
Конечно это не отменяет основной критики.
Но проблема в том коде даже не в этом, а в попытке записать большой объем данным единым потоком, с циклическими единичными транзакциями. Запросы insert в цикле.
74. uno-c 235 16.09.19 07:25 Сейчас в теме
(73) Я уже было полез искать, неужели иерархический выбор как-то на блокировке отражается, спасибо, что жирным выделили ) Какой Вы внимательный.
98. ogre2007 298 16.09.19 16:19 Сейчас в теме
Все. Всем спасибо за участие. Тестирующий забраковал оба моих решения, сказали "совсем мимо". Как нужно было я наверное уже не узнаю. Пойду учиться дальше :) Вознаграждение самым активным.
user811769; +1 Ответить
99. triviumfan 93 16.09.19 16:40 Сейчас в теме
(98) Как я и предполагал :)
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)