8.2 Управляемая форма. Данные были изменены или удалены другим пользователем
<Документ.Заказы.Форма.ФормаДокумента.Форма(1649)>: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
ОбъектБазы = ДанныеФормыВЗначение(Объект, Тип(«ДокументОбъект.Заказы»));
по причине:
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
УправляемаяФорма (ManagedForm)
ОбновитьОтображениеДанных (RefreshDataRepresentation)
Синтаксис:
В принудительном порядке обновляет содержание элементов управления.
Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.
?
Заметки по 1С:Предприятие 8.2, 8.3
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
Страницы
- Главная
- Полезности
- Мои сертификаты
вторник, 21 января 2014 г.
Данные были изменены или удалены другим пользователем (тонкий клиент)
Если при попытке записать элемент справочника или документ появляется ошибка «Данные были изменены или удалены другим пользователем», то это значит, что данные, которые отображаются на форме и данные, которые записаны в базе отличаются.

Возможно, их изменил другой пользователь или мы программно их изменили, но форму не обновили. Решить эту проблему можно, используя метод управляемой формы Прочитать(). Этот метод обновляет объект управляемой формы.
&НаКлиенте
Процедура ОбработкаОповещения ( ИмяСобытия , Параметр , Источник )
Если ИмяСобытия = «УправлениеКартамиYandex_ВыбраныКоординаты» Тогда
Если Не ЗначениеЗаполнено ( Объект . Ссылка ) Тогда
Возврат;
КонецЕсли;
ЭтаФорма . Прочитать ();
ЗаполнитьКоординаты ( Параметр );
ЭтаФорма . Прочитать ();
КонецЕсли;
Процедура ЗаполнитьКоординаты ( Параметр )
МассивСтрок = РаботаСоСтроками . РазложитьСтрокуВМассив ( Параметр , «;» );
Если МассивСтрок . Количество ()> 0 Тогда
текОбъект = Объект . Ссылка . ПолучитьОбъект ();
текОбъект . Долгота = СокрЛП ( МассивСтрок [ 0 ]);
текОбъект . Широта = СокрЛП ( МассивСтрок [ 1 ]);
текОбъект . Записать ();
КонецЕсли;
В примере, через обработку оповещения передаем параметр в процедуру, в которой присваиваем полученные координаты долготы и широты и записываем объект. Потом, используя метод Прочитать(), обновляем объект формы. В данном случае метод вызван 2 раза в связи с тем, что до заполнения координат, он изменяется, а второй раз — чтобы прочитать изменения, которые сделали мы.
Данные были изменены или удалены другим пользователем 1с как обойти
Gigi —>
Gigi ![]()
![]()
Просмотр профиля
Найти сообщения пользователя
Всем привет!
Никто не подскажет как это сделать.
Ну на пример имеются два объекта справочника (На пример "Справочник1" и "Справочник2") с одинаковыми реквизитами типа ссылка с одинаковым именем на пример: "СсылкаСвязи". Которые взаимно ссылаются друг-другу.
В справочнике: "Справочник1" в модуле формы в событии ПередЗаписью вписана процедура которая пере-сохраняет объект справочника: "Справочник2" на который ссылается реквизит "СсылкаСвязи". Но до этого пере-сохраняемому объекту справочника: "Справочник2" в реквизите "СсылкаСвязи" присваиваться ссылка на объект "Справочник1". И при всем этом уже в самом справочнике: "Справочник2" уже в модуле объекта в событии ПередЗаписью вписана процедура, которая пере-сохраняет объект "Справочника1" той ссылки которая указана в реквизите: "СсылкаСвязи". В чем возникает проблема. в том что при сохранении объекта "Справочник1" если реквизит: "СсылкаСвязи" не пуст всплывает сообщение: "данные были изменены другим пользователем". Вот какая проблема. Т.е. при сохранении справочника: "Справочник2" все нормально. До записи ссылка присваивается объекту справочника1 . А в случае с объектом Справочника1 если реквизит: "СсылкаСвязи" не пуст сохранить его естественно невозможно.
Мешает это сделать сообщение: "данные были изменены другим пользователем".
Поэтому вопрос .
Как убрать это сообщение. временно в самой процедуре. И не только убрать но интерактивно пере-сохранить то, что уже было программно перезаписано до закрытия открытой формы.
Вот какой вопрос.
Буду признателен!
Gigi @ Сегодня, 11:36 ,
PS
Дело в том, что я пробовал разные варианты событий . ПослеЗаписи, ПриЗаписиНаСервере и т.д. но при таком изменении если сообщение не возникало то не получалось сделать то что нужно. И это уже вопрос другой темы.
Так что, вопрос в том как временно в процедуре отключить ограничение: "данные были изменены другим пользователем". Временно . только в момент выполнения процедур.
Gigi @ Сегодня, 12:04 ,
Гууу. я уже решил проблему.
Нужно было в "Справочнике1" после процедуры пере-сохранения Объекта справочника "Справочнике2" вписать команду:
Вот и весь вопрос решения!
И вот и весь ответ который мне и нужен был. Но которого так и не дождался.
Что не в стиле данного сайта. Тут ведь обычно реакция моментальная как я сам не раз убеждался.
Но ладно. наверно бывают исключения.
Пока!
Обманчивая ошибка "Данные были изменены или удалены другим пользователем"

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "///// echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1.
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.
Собственно сам скрипт:
<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
$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=’\