<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.standart-n.ru/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.standart-n.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Avo</id>
		<title>wiki.standart-n.ru - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.standart-n.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Avo"/>
		<link rel="alternate" type="text/html" href="http://wiki.standart-n.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Avo"/>
		<updated>2026-06-01T08:04:22Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.23.3</generator>

	<entry>
		<id>http://wiki.standart-n.ru/index.php/%D0%A1%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F:%D0%9E%D0%B1%D1%89%D0%B8%D0%B5_%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B_%D0%BF%D0%BE_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8</id>
		<title>Синхронизация:Общие вопросы по синхронизации</title>
		<link rel="alternate" type="text/html" href="http://wiki.standart-n.ru/index.php/%D0%A1%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F:%D0%9E%D0%B1%D1%89%D0%B8%D0%B5_%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B_%D0%BF%D0%BE_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8"/>
				<updated>2021-07-02T08:03:35Z</updated>
		
		<summary type="html">&lt;p&gt;Avo: /* Пустые наименования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Порядок действий, если не работает синхронизация=&lt;br /&gt;
&lt;br /&gt;
==На стороне клиента==&lt;br /&gt;
* Обновить Distribute Client.&lt;br /&gt;
* Убрать настройку '''перезапуск раз в n циклов'''.&lt;br /&gt;
* Убрать галку '''хранить историю в g$distribute'''.&lt;br /&gt;
* Проверить таймауты, ограничения пакетов. &lt;br /&gt;
* Удалить все лишнее из папки с dtclient'ом (*.zip и *.rcvd файлы).&lt;br /&gt;
* Выключить брэндмауэр и антивирус. &lt;br /&gt;
* Запустить exe с ключом +detail&lt;br /&gt;
* Запустить программу от имени администратора&lt;br /&gt;
* Проверить, что дата/время на компьютере установлена верно.&lt;br /&gt;
* Поискать запись по d$uuid в g$distribute в первой, серверной и второй базах, чтобы определить между какими базами проблема.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from g$distribute g where g.uuid=&amp;quot;...&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Посмотреть когда были последние данные, которые пришли по синхронизации: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from g$distribute g order by  g.serverpacket desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Если запись не ушла из первой базы в серверную, то сравните поле packet, а если она из серверной не дошла до второй базы, то сравните поле serverpacket.&lt;br /&gt;
* Проверяем, что на странице [[http://192.168.67.30/sinhro/| http://192.168.67.30/sinhro/]] данный профиль не светится с флагом -1, иначе ошибка на сервере.&lt;br /&gt;
* Проверить, что dt клиент включен. &lt;br /&gt;
* url адрес который прописан в клиенте, открывается в браузере и выдает '''no input data'''&lt;br /&gt;
** если не работает, проверить, что на сервере включен wamp. &lt;br /&gt;
** иначе если URL начинается с 10, проверить, что поднят open vpn.&lt;br /&gt;
* dt клиент не выдает ошибок при скачивании. &lt;br /&gt;
* dt клиент что-то скачивет, пишется объем траффика. &lt;br /&gt;
* если процесс скачивания идет '''очень долго''', запустить dt клиент с ключом +detail и посмотреть на каких запросах тормозит.&lt;br /&gt;
* если проблема с таблицей по старой синхронизации, взять максимальное значение поля '''packet''' по этой таблице по этому профилю '''на сервере''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 select max(packet) from :table where g$profile=:profle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
и подставить его в генератор поля '''packet''' этой таблицы '''в клиентской базе''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 GEN_%TABLE%_PACKET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* проапдейтить необходимые записи.&lt;br /&gt;
* Посмотреть за какое число сейчас пытается скачать даннные клиент. Берем '''uuid''' последней записи:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select g.uuid from g$distribute g order by  g.serverpacket desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Затем выполняем '''на сервере''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select g.insertdt, g.updatedt from g$distribute g where g.uuid=&amp;quot;...&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Если даты старые''' (больше недели), то проверяем актуален ли serverpacket на клиенте. Выполняем на сервере:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select serverpacket from g$distribute where from_profile_id=:profile_id order by serverpacket desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Выполняем на клиенте:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select serverpacket from g$distribute where 1=1 order by serverpacket desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Сравниваем. '''Если на сервере значение меньше''', то обновляем на клиенте:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update g$distribute set serverpacket=:serverpacket where serverpacket=(select max(g.serverpacket) from g$distribute g)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Проверить базу на ошибки.&lt;br /&gt;
Снова запускаем синхронизацию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==На сервере==&lt;br /&gt;
===Основное===&lt;br /&gt;
* Сервер доступен&lt;br /&gt;
* База ZTRADE_G.FDB доступна&lt;br /&gt;
* WAMP запущен &lt;br /&gt;
* Служба StandartNDistributeQueueService запущена;&lt;br /&gt;
&lt;br /&gt;
===Дополнительно===&lt;br /&gt;
* Поискать запись по d$uuid в g$distribute в первой, серверной и второй базах, чтобы определить между какими базами проблема.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from g$distribute g where g.uuid=&amp;quot;...&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Посмотреть когда были последние данные, которые пришли по синхронизации: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from g$distribute g where g.from_profile_id=:profile_id order by g.serverpacket desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* в таблице '''g$queue''' есть свежие данные:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from g$queue q where q.profile_id=:profile_id order by q.insertdt desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* в таблице '''docs''' есть свежие данные &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from docs d where d.g$profile_id=:profile_id order by d.commitdate desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Посмотрите на поле '''endflag''': если там '''-1''', значит ошибка.&lt;br /&gt;
* профиль прописан в '''g$profiles''', '''status=0''', '''dbsecurekey not null''', остальные колонки как у других '''подобных''' профилей. &lt;br /&gt;
* в таблице '''G$DISTRIBUTE_VECTORS''' есть строчка с '''tablename''' нужной таблицы, где '''to_profile_id''' либо '''0''', либо '''номер базы''', куда данные должны уйти.&lt;br /&gt;
* в таблице '''G$DISTRIBUTE_X_TABLES''' по данному профилю настройки такие же как и у других профилей и там верно указано какой таблице на сервере соответствует таблица на клиенте.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 select * from docs order by docdate desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* если есть таблица g$queue, смотрим когда были последние пакеты и есть ли по ним ошибки.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 select * from g$queue q where q.profile_id=:profile_id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Firebird работает. Если linux, то &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/firebird&amp;lt;Tab&amp;gt; status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
если нужно перезапустить:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/firebird&amp;lt;Tab&amp;gt; restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Wamp включен. Если linux, то&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/apache&amp;lt;Tab&amp;gt; status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
если нужно перезапустить&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/apache&amp;lt;Tab&amp;gt; stop&lt;br /&gt;
/etc/init.d/apache&amp;lt;Tab&amp;gt; start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Удалить все содержимое каталогов users и queue. Если linux, то&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ... &amp;lt;путь до скриптов&amp;gt;&lt;br /&gt;
cd users&lt;br /&gt;
&amp;lt;убедитесь, что вы точно зашли в папку users&amp;gt;&lt;br /&gt;
rm -R ./* -v&lt;br /&gt;
cd ../queue&lt;br /&gt;
&amp;lt;убедитесь, что вы зашли в папку queue&amp;gt;&lt;br /&gt;
rm -R ./* -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Проверить, что дата/время на компьютере установлено верно. Если linux, то&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
если нужно установить время:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
date +%T -s &amp;quot;11:14:00&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Проверить настройки в declare.php. Если linux, то&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ... &amp;lt;путь до скриптов&amp;gt;&lt;br /&gt;
nano declare.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Служба очереди работает.&lt;br /&gt;
&lt;br /&gt;
=Частые вопросы=&lt;br /&gt;
==Distribute Client не запускается, выходит ошибка &amp;quot;программа уже запущена&amp;quot;==&lt;br /&gt;
Перезагрузите firebird или сделайте базу в даун и снова онлайн.&lt;br /&gt;
&lt;br /&gt;
==Как синхронизировать таблицу==&lt;br /&gt;
В скриптах ниже нужно исправить MY_TABLE на название вашей таблицы.&lt;br /&gt;
&lt;br /&gt;
===В клиентской базе которую хотим распространить===&lt;br /&gt;
* Добавляем поля D$UUID и D$SRVUPDDT&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE MY_TABLE &lt;br /&gt;
ADD D$UUID DM_UUID;&lt;br /&gt;
ALTER TABLE MY_TABLE &lt;br /&gt;
ADD D$SRVUPDDT DM_DATETIME;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Делаем первичный ключ на поле d$uuid:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE MY_TABLE&lt;br /&gt;
ADD CONSTRAINT PK_MY_TABLE&lt;br /&gt;
PRIMARY KEY (D$UUID);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
или уникальный&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE MY_TABLE&lt;br /&gt;
ADD CONSTRAINT UNQ1_MY_TABLE&lt;br /&gt;
UNIQUE (D$UUID);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Генерируем значения поля d$uuid: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update MY_TABLE set d$uuid=UUID_TO_CHAR(GEN_UUID()), d$srvupddt='2000-01-01';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Создаем триггеры:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET SQL DIALECT 3;&lt;br /&gt;
SET TERM ^ ;&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_BI_DISTR FOR MY_TABLE&lt;br /&gt;
ACTIVE BEFORE INSERT POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
   if (new.d$uuid is null) then&lt;br /&gt;
  begin&lt;br /&gt;
    /*Запрещаем менять данные, если централизованное управление*/&lt;br /&gt;
    /*&lt;br /&gt;
    if (cast((select param_value from params where param_id = 'CODE_PROFILE') as dm_id) &amp;lt;&amp;gt; 2) then&lt;br /&gt;
      exception ex_wrong_db;&lt;br /&gt;
    */&lt;br /&gt;
    new.d$uuid=UUID_TO_CHAR(GEN_UUID());&lt;br /&gt;
    update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('MY_TABLE,new.d$uuid,0,null) matching (TABLENAME,UUID);&lt;br /&gt;
  end&lt;br /&gt;
  if (new.d$srvupddt is null) then&lt;br /&gt;
    new.d$srvupddt='2000-01-01';&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_BU_DISTR FOR MY_TABLE&lt;br /&gt;
ACTIVE BEFORE UPDATE POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  if (new.D$SRVUPDDT=old.D$SRVUPDDT) then&lt;br /&gt;
    begin&lt;br /&gt;
     /*Запрещаем менять данные, если централизованное управление*/&lt;br /&gt;
     /*&lt;br /&gt;
     if (cast((select param_value from params where param_id = 'CODE_PROFILE') as dm_id) &amp;lt;&amp;gt; 2) then&lt;br /&gt;
      exception ex_wrong_db&lt;br /&gt;
     */&lt;br /&gt;
     update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('MY_TABLE',new.d$uuid,1,null) matching (TABLENAME,UUID);&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_AD_DISTR FOR MY_TABLE&lt;br /&gt;
ACTIVE AFTER DELETE POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
    /*Запрещаем менять данные, если централизованное управление*/&lt;br /&gt;
     /*&lt;br /&gt;
    if (cast((select param_value from params where param_id = 'CODE_PROFILE') as dm_id) &amp;lt;&amp;gt; 2) then&lt;br /&gt;
      exception ex_wrong_db;&lt;br /&gt;
    */&lt;br /&gt;
    update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('MY_TABLE',old.d$uuid,2,null) matching (TABLENAME,UUID);&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
SET TERM ; ^&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Делаем update, чтобы отправить данные на сервер:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update MY_TABLE set id=id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Для того, что бы не было конфликтов ID на точках при двух сторонней синхронизации необходимо отправить по сети чистку данных в точках, если они есть''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
delete from MY_TABLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Настраиваем одностороннюю синхронизацию на сервере===&lt;br /&gt;
* Создаем таблицу с той структурой, которую сделали в клиентских базах '''(переносим только структуру)'''.&lt;br /&gt;
* Не забываем сделать поле d$uuid уникальным:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE DOCS ADD CONSTRAINT PK_MY_TABLE PRIMARY KEY (D$UUID);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Добавляем поле G$PROFILE_ID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE MY_TABLE&lt;br /&gt;
ADD G$PROFILE_ID DM_ID;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Создаем триггеры:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET SQL DIALECT 3;&lt;br /&gt;
SET TERM ^ ;&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_BI_SRVSYNC FOR MY_TABLE&lt;br /&gt;
ACTIVE BEFORE INSERT POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  select from_profile_id from g$distribute where uuid=new.d$uuid into new.g$profile_id;&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_BU_SRVSYNC FOR MY_TABLE&lt;br /&gt;
ACTIVE BEFORE UPDATE POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  select from_profile_id from g$distribute where uuid=new.d$uuid into new.g$profile_id;&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
SET TERM ; ^&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Настраиваем двухстороннюю синхронизацию на сервере==&lt;br /&gt;
* Создаем таблицу с той структурой, которую сделали в клиентских базах '''(переносим только структуру)'''.&lt;br /&gt;
* Если в таблице первоначально сделано уникальное поле '''G$PROFILE_ID, то нужно его удалить''' &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE MY_TABLE DROP CONSTRAINT FK_MY_TABLE_1;&lt;br /&gt;
ALTER TABLE MY_TABLES DROP G$PROFILE_ID;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Не забываем сделать поле d$uuid уникальным:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_MY_TABLE PRIMARY KEY (D$UUID);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Добавляем триггеры:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET SQL DIALECT 3;&lt;br /&gt;
SET TERM ^ ;&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_AD0_DISTR FOR MY_TABLE&lt;br /&gt;
ACTIVE AFTER DELETE POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('MY_TABLE',old.d$uuid,2,0) matching (TABLENAME,UUID);&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_BI_DISTR FOR MY_TABLE&lt;br /&gt;
ACTIVE BEFORE INSERT POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  if (new.d$uuid is null) then&lt;br /&gt;
  begin&lt;br /&gt;
    new.d$uuid=UUID_TO_CHAR(GEN_UUID());&lt;br /&gt;
    update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('MY_TABLE',new.d$uuid,0,0) matching (TABLENAME,UUID);&lt;br /&gt;
  end&lt;br /&gt;
  if (new.d$srvupddt is null) then&lt;br /&gt;
    new.d$srvupddt='2000-01-01';&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
CREATE OR ALTER TRIGGER MY_TABLE_BU0_DISTR FOR MY_TABLE&lt;br /&gt;
ACTIVE BEFORE UPDATE POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  if (new.D$SRVUPDDT=old.D$SRVUPDDT) then&lt;br /&gt;
    update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('MY_TABLE',new.d$uuid,1,0) matching (TABLENAME,UUID);&lt;br /&gt;
end&lt;br /&gt;
^&lt;br /&gt;
&lt;br /&gt;
SET TERM ; ^&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Добавляем информацию о нашей таблице в G$DISTRIBUTE_VECTORS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INSERT INTO G$DISTRIBUTE_VECTORS (FROM_PROFILE_ID, TO_PROFILE_ID, TABLENAME, PERMISSION) VALUES (0, 0, 'MY_TABLE', 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Добавляем информацию о нашей таблице в G$DISTRIBUTE_X_TABLES, если профилей уже много в базе можно применить выполнение блока:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
execute block&lt;br /&gt;
as&lt;br /&gt;
declare variable PROFILE_ID type of DM_ID;&lt;br /&gt;
begin&lt;br /&gt;
for select md.id from g$profiles md&lt;br /&gt;
where status =0 and md.dbsecurekey is not null and  relationtype=1 into :profile_id do&lt;br /&gt;
INSERT INTO G$DISTRIBUTE_X_TABLES (PROFILE_ID, TABLENAME, CLIENTTABLENAME)&lt;br /&gt;
                           VALUES (:profile_id, 'MY_TABLE', 'MY_TABLE');&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяем не исключена ли наша таблица на сервере wamp в '''getrelationtype.php''' выполняем поиск нашей таблицы. &lt;br /&gt;
'''Данные отправляются если они попадают под условия return 0;'''&lt;br /&gt;
&lt;br /&gt;
Дополнительно проверить что было отправлено при необходимости:&lt;br /&gt;
* '''Для того, что бы не было конфликтов ID на точках необходимо отправить по сети чистку данных в точках:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
delete from MY_TABLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Добавить запись к частично-двусторонней синхронизации==&lt;br /&gt;
* Для чего нужно: требуется для настройки групп (GROUPS) где часть записей существует самостоятельно в клиентской базе, а часть нужно поддерживать в едином варианте по всей сети.&lt;br /&gt;
* Допустим нужно запись ID=:ID таблицы MY_TABLE настроить так, что бы изменения &amp;quot;ходили&amp;quot; по двусторонней синхронизации.&lt;br /&gt;
* Внести исправления в getrelationtype.php&lt;br /&gt;
* Удалить все следы записи в серверной и сводных базах.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
delete from MY_TABLE where ID=:ID; &lt;br /&gt;
delete from g$distribute where tablename='MY_TABLE' where uuid=(select t.d$uuid from my_table t where t.ID=:ID);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Обеспечить идентичные d$uuid у нужной записи во всех клиентских базах, только аккуратно, что бы при установке новых d$uuid запись не пошла по синхронизации, для этого в запросе добавим Update d$srvupddt. Данные sql-запросы можно разослать с помощью g$tasks.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
delete from g$distribute where tablename='MY_TABLE' where uuid=(select t.d$uuid from my_table t where t.ID=:ID);&lt;br /&gt;
update MY_TABLE set d$uuid=:new_d$uuid, d$srvupddt=current_timestamp where ID=:ID;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Теперь можно вносить изменения в записи и она разойдется по всей сети без ошибок.&lt;br /&gt;
&lt;br /&gt;
==Можно ли вручную перенести записи если они не приходят по синхронизации?==&lt;br /&gt;
Теоретически если записи по непонятным причинам не доходят по синхронизации, а нужно, чтобы эти данные срочно появились в нужной базе, то теоретически можно вручную скопировать эти записи и вставить их в базу вручную через ibexpert. Главное перед этим посмотреть: данная таблица синхронизируется в одну сторону, или в обе стороны, т.е. в клиентской базе данные только этой базы, или вообще всей сети?&lt;br /&gt;
* в первом случае при вставке записей не нужно заполнять поле d$uuid для того, чтобы оно сгенерировалось бы заново. &lt;br /&gt;
* во втором случае нужно обязательно заполнить поле d$uuid оригинальными значениями.&lt;br /&gt;
Если сделать наоборот, то затем, когда записи, которые должны были дойти по синхронизации, дойдут, а они со временем обязательно дойдут, в базах будут возникать конфликты при вставке записей, связанные с пересечением ключей.&lt;br /&gt;
&lt;br /&gt;
==Пустые наименования==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Для начала проверить все ли настройки выполенны, так как если они не выполнены, то проблема вернется&lt;br /&gt;
1) поправить declare.php (убрать WARES.SNAME, поле должно приходить по синхронизации с локальной базы);&lt;br /&gt;
2) проверить триггеры на wares.sname на серверной БД (заполнения поля на серверной/сводной БД быть не должно);&lt;br /&gt;
3) сделать поле wares.sname на серверной БД NOT NULL (поле должно быть всегда заполнено);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Сначала нужно определиться чего именно не хватает. Партия цепляет варес, варес цепляет валс. Обычно не хватает или вареса или валса. Бывает, что все есть, но в валсе пустое значение (в этом случае нужно в менеджере два раза нажать на наименование и вставить оригинальное значение товара). &lt;br /&gt;
выполняем запрос, берем ware_id и выполняем следующий, смотрим есть ли значение наименование sname&lt;br /&gt;
 '''select name_id, sname from wares where id=:ware_id'''&lt;br /&gt;
берем ware_id и выполняем следующий, смотрим есть ли значение наименование sname&lt;br /&gt;
 '''select svalue from vals v where v.id=:name_id'''&lt;br /&gt;
&lt;br /&gt;
Если '''в wares поле sname = null''', а '''svalue в vals имеет значение''' выполняем обновление:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update&lt;br /&gt;
 wares w&lt;br /&gt;
 set w.sname=(select v.svalue from vals v where v.id=w.name_id)&lt;br /&gt;
 where ((sname='') or (sname is null)) and (select v.svalue from vals v where v.id=w.name_id) is not null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после выполнения update wares обновляем сводные остатки:&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
update&lt;br /&gt;
 warebase_g w&lt;br /&gt;
 set w.part_id=part_id&lt;br /&gt;
 where w.sname is null &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
/*Если не помогает делаем напрямую исправление наименования в сводных остатках по name_id*/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 update&lt;br /&gt;
 warebase_g w&lt;br /&gt;
 set w.sname=(select v.svalue from vals v where v.id=w.name_id)&lt;br /&gt;
 where w.sname is null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Бывают случаи, когда наименование привелось к пустому значению, т.е. проблема в приведении. Попробуйте поискать связки:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select 'WARES', V.SVALUE&lt;br /&gt;
from WARES WL&lt;br /&gt;
left join VALS V on WL.NAME_ID = V.ID&lt;br /&gt;
where WL.ID = :ware_id&lt;br /&gt;
union&lt;br /&gt;
select 'WARES_LOG', V.SVALUE&lt;br /&gt;
from WARES_LOG WL&lt;br /&gt;
left join VALS V on WL.NAME_ID = V.ID&lt;br /&gt;
where WL.ID = :ware_id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Когда определись чего не хватает в текущей базе, попробовать поискать этот валс или варес в другой серверной, сводной или клиентской базе по его id.&lt;br /&gt;
* Если проблема была в варесе, то скорей всего он есть где то в другой базе и его достаточно проапдейтить:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update wares w where w.id=:id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Если проблема с валсом, то нужно перепривязать данное поле вареса, которое на него ссылается, на другое значение (другой валс). Если, например, проблема с наименованием, а оригинальное наименование ссылается на другое значение, то возьмите его и вставьте в название. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update wares w set w.name_id=(select wa.orig_name_id from wares wa where wa.id=:ID) where w.id=:ID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Нужно чтобы закрытая аптека не висела бы на sinhro но чтобы данные по ней отображались в своднике==&lt;br /&gt;
Поставить dbsecurekey в таблицы g$profiles в null.&lt;br /&gt;
&lt;br /&gt;
==На sinhro пишется ошибка загрузки пакета и дата очень старая а по docs дата недавняя==&lt;br /&gt;
На sinhro берется дата по последнему пакету таблицы g$queue, но из этой таблицы очищаются данные по положительным пакетам старше 3х дней. Поэтому, если последние 3 дня вообще не было синхронизации, то из таблицы сотрутся все данные по неошибочным пакетам и самой последней строчкой будет - самый последний ошибочный пакет. Поэтому, если пишется &amp;quot;ошибка загрузки пакета&amp;quot;, но дата старше 3х дней, то это совсем не значит, что ошибка при загрузке на сервер. &lt;br /&gt;
&lt;br /&gt;
==Что можно удалить если синхронизация много весит (каталог wamp занимаем очень много места, больше 1гб)?==&lt;br /&gt;
* В папке '''queue''' можно чистить все кроме последних 2х дней. &lt;br /&gt;
* В папке '''users''' можно чистить все.&lt;br /&gt;
&lt;br /&gt;
==Как переотправить накладную требования/перемещение/переоценки по синхронизации==&lt;br /&gt;
* Нужно подключиться к базе, с которой была отправлена накладная.&lt;br /&gt;
* Найти doc_id нужного документа по его номеру:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from docs d where d.caption containing :docnum&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Переотправить накладную спомощью процедуры:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
execute procedure GM$PR_PRIHOD_DOC_TREB(:doc_id);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Как отправить (выполнить) большой SQL на клиенте==&lt;br /&gt;
Для этого используется процедура UTPR_MASTERDETAIL_CF. Если ее нет ниже SQL:&lt;br /&gt;
&lt;br /&gt;
 SET TERM ^ ;&lt;br /&gt;
 create or alter procedure UTPR_MASTERDETAIL_CF&lt;br /&gt;
 as&lt;br /&gt;
 declare variable PROFILE_ID type of DM_ID;&lt;br /&gt;
 declare variable S DM_TEXT1024;&lt;br /&gt;
 declare variable STR DM_BLOBTEXT;&lt;br /&gt;
 begin&lt;br /&gt;
  for select md.id from g$profiles md&lt;br /&gt;
 where md.dbsecurekey is not null and md.relationtype=1 and status=0&lt;br /&gt;
 --and  md.id in (100)&lt;br /&gt;
 into :profile_id do&lt;br /&gt;
  begin&lt;br /&gt;
    str='file:D:\sql\файл для отправки';&lt;br /&gt;
 --    select data from g$tasks where id=546430 into str;&lt;br /&gt;
    insert into g$tasks (PROFILE_ID,TASK_TYPE,CAPTION,data,checkprevtask) values (:profile_id,0, 'Описание task',:str,null);&lt;br /&gt;
  end&lt;br /&gt;
 end^&lt;br /&gt;
 SET TERM ; ^&lt;br /&gt;
 GRANT SELECT ON G$PROFILES TO PROCEDURE UTPR_MASTERDETAIL_CF;&lt;br /&gt;
 GRANT INSERT ON G$TASKS TO PROCEDURE UTPR_MASTERDETAIL_CF;&lt;br /&gt;
 GRANT EXECUTE ON PROCEDURE UTPR_MASTERDETAIL_CF TO SYSDBA;&lt;br /&gt;
&lt;br /&gt;
В строке '''str='file:D:\sql\файл для отправки';''' указываем путь до файла с файлом SQL&lt;br /&gt;
&lt;br /&gt;
Теги: отправить, выполнить, большой SQL, SQL&lt;br /&gt;
&lt;br /&gt;
==Отправить сетку отображения (распространить вид) таблицы по сети== &lt;br /&gt;
Для того что бы отправить сетку всем пользователям по сети или нужным профилям в пределах одной сети нужно выполнить следующее:&lt;br /&gt;
    &lt;br /&gt;
1. Создаем нужную сетку (вид) которую нужно распространить.&lt;br /&gt;
&lt;br /&gt;
2. Заходим в таблицу '''USERS''', находим пользователя под  которым у нас правильная сетка и переходим в поле '''Data'''&lt;br /&gt;
&lt;br /&gt;
3. В поле '''Data''' должна быть выбрана вкладка '''AsText - ANSI'''. В Верху на панели нажимает кнопку с обозначением Дискетки - сохранить. &lt;br /&gt;
&lt;br /&gt;
4. В открывшемся окне выбираем нужную папку для сохранения, тип файла: Все файлы (*.*), набираем понятное имя файла и '''в конце обязательно добавляем &amp;quot;.ZIP&amp;quot;''', запоминаем путь, нажимаем кнопку Cохранить.&lt;br /&gt;
&lt;br /&gt;
5. Переходим в каталог куда мы сохранили файл, находим его и распаковываем в папку и переходим в эту папку&lt;br /&gt;
&lt;br /&gt;
6. Выполняем сортировку по дате изменения так, что бы можно было определить самый новый файл. Находим нужную нам сетку, она будет самая новая и быть без какого-либо расширения, например DocArchHeader&lt;br /&gt;
&lt;br /&gt;
7. Архивируем нужную нам сетку или если их несколько то несколько в одном файле, запоминаем путь. &lt;br /&gt;
&lt;br /&gt;
8. Открываем IBExpert, заходим в серверную базу, обычно называется ZTRADE_G.FDB, нам нужна процедура UTPR_MASTERDETAIL_GRID Заходим в нее. Если ее нет ниже SQL:&lt;br /&gt;
&lt;br /&gt;
 SET TERM ^ ;&lt;br /&gt;
 create or alter procedure UTPR_MASTERDETAIL_GRID&lt;br /&gt;
 as&lt;br /&gt;
 declare variable PROFILE_ID type of DM_ID;&lt;br /&gt;
 declare variable S DM_TEXT1024;&lt;br /&gt;
 declare variable STR DM_BLOBTEXT;&lt;br /&gt;
 begin&lt;br /&gt;
   for select md.id from g$profiles md&lt;br /&gt;
 where md.dbsecurekey is not null and relationtype=1 and status=0&lt;br /&gt;
 --and  md.id not in (57,157)&lt;br /&gt;
 into :profile_id do&lt;br /&gt;
   begin&lt;br /&gt;
     str='';&lt;br /&gt;
  insert into g$tasks (PROFILE_ID,TASK_TYPE,CAPTION,data) values&lt;br /&gt;
   (:profile_id,2,'Сетка журнала документов -2', (select data from G$TASKS_TMPL where id = 0));&lt;br /&gt;
   end &lt;br /&gt;
 end^&lt;br /&gt;
 SET TERM ; ^&lt;br /&gt;
 GRANT SELECT ON G$PROFILES TO PROCEDURE UTPR_MASTERDETAIL_GRID;&lt;br /&gt;
 GRANT INSERT ON G$TASKS TO PROCEDURE UTPR_MASTERDETAIL_GRID;&lt;br /&gt;
 GRANT SELECT ON G$TASKS_TMPL TO PROCEDURE UTPR_MASTERDETAIL_GRID;&lt;br /&gt;
 GRANT EXECUTE ON PROCEDURE UTPR_MASTERDETAIL_GRID TO SYSDBA;&lt;br /&gt;
&lt;br /&gt;
9  В процедуре есть текст, типа (select data from G$TASKS_TMPL where id = 0) смотрим какой id указан и переходим в эту таблицу G$TASKS_TMPL. Под указанным ID в данном случае 0 открываем поле DATA должна быть выбрана вкладка '''AsText - ANSI'''.&lt;br /&gt;
&lt;br /&gt;
10. Нажимаем кнопку Открыть, выбираем файл подготовленный в п.7, подтверждаем изменения - делаем коммит&lt;br /&gt;
&lt;br /&gt;
11. В процедуре '''UTPR_MASTERDETAIL_GRID''' выбираем 1 профиль и выполняем процедуру. Через некоторое время проверяем изменения на объекте. Если все хорошо отправляем сетку всех профилей у кого она должна быть, внеся изменения в указанную процедуру.&lt;br /&gt;
&lt;br /&gt;
Все проверяем через некоторое время исправления должны быть у всех пользователей.&lt;br /&gt;
&lt;br /&gt;
==Как отправить поле типа Blob по синхронизации на примере таблицы Reports==&lt;br /&gt;
 &lt;br /&gt;
 '''Внимание!!! Для сетей, где таблицы ходят по двухсторонней синхронизации смотри раздел выше &amp;quot;Добавить запись к частично-двусторонней синхронизации&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
Для отправки добавления отчета в таблицу Reports используется штатный механизм отправки тасков процедура '''&amp;quot;UTPR_MASTERDETAIL&amp;quot;''' отправляем всем нужным профилям добавление отчета:&lt;br /&gt;
 &lt;br /&gt;
 INSERT INTO REPORTS (PARENT_ID, STATUS, REPORTTYPE, SORTING, CAPTION, PARAMS, WDICT_ID)&lt;br /&gt;
             VALUES (0, 0, 1, 400, ''Новый отчет'', ''[freereport]&lt;br /&gt;
 tmplpath=&lt;br /&gt;
 '', NULL);&lt;br /&gt;
 &lt;br /&gt;
Далее сохраняем поле DATA таблицы REPORTS с нужным нам отчетом в txt. Далее открываем таблицу любую таблицу которая ходит по двухсторонней синхронизации, например таблица G$PROFILES. Находим у таблицы поля типа Blob которые не используются, например, TMP_BLOB1 ... TMP_BLOB_N. Если нет можно создать и распространить по сети. &lt;br /&gt;
Далее в данное поле сохраняем выгруженный нами отчет и Коммитим изменения - ''''' ЖДЕМ НЕСКОЛЬКО ЧАСОВ!!! ''''' что бы данные дошли до точек. После этого создаем новый таск используя процедуру '''UTPR_MASTERDETAIL''', где обновляем таблицу REPORTS по полю дата заменяю его значением из G$PROFILES:&lt;br /&gt;
 update reports r set r.data = (select TMP_BLOB1 from g$profiles where id=1 and TMP_BLOB1 is not null) where r.caption =''Новый отчет'';&lt;br /&gt;
&lt;br /&gt;
Теги: отправить, поле, Blob, синхронизация, UTPR_MASTERDETAIL&lt;br /&gt;
&lt;br /&gt;
==Как добавить на панель АРМ Кассира кнопку с нужным действием (ТМС, Отчет)==&lt;br /&gt;
 '''Важно!!! На момент проведения действия кассиры должны быть все закрыты!!! В противном случае, после закрытия АРМ Кассир все изменения будут заполнены текущими настройками '''&lt;br /&gt;
Для рапространения требуется процедура '''&amp;quot;UTPR_MASTERDETAIL_KASSIR&amp;quot;''', если ее нет нужно добавить скрипт ниже:&lt;br /&gt;
 SET TERM ^ ;&lt;br /&gt;
 create or alter procedure UTPR_MASTERDETAIL_KASSIR&lt;br /&gt;
 as&lt;br /&gt;
 declare variable PROFILE_ID type of DM_ID;&lt;br /&gt;
 declare variable S DM_TEXT1024;&lt;br /&gt;
 declare variable STR DM_BLOBTEXT;&lt;br /&gt;
 begin&lt;br /&gt;
   for select md.id from g$profiles md&lt;br /&gt;
 where md.dbsecurekey is not null and relationtype=1 and status=0&lt;br /&gt;
 into :profile_id do&lt;br /&gt;
   begin&lt;br /&gt;
     --str='';&lt;br /&gt;
  insert into g$tasks (PROFILE_ID,TASK_TYPE,CAPTION,data) values&lt;br /&gt;
   (:profile_id,4,'Кнопка в кассире', 'file:E:\Standart-N\tasks\kassabuttons.txt');&lt;br /&gt;
   end &lt;br /&gt;
 end^&lt;br /&gt;
 SET TERM ; ^&lt;br /&gt;
 GRANT SELECT ON G$PROFILES TO PROCEDURE UTPR_MASTERDETAIL_KASSIR;&lt;br /&gt;
 GRANT INSERT ON G$TASKS TO PROCEDURE UTPR_MASTERDETAIL_KASSIR;&lt;br /&gt;
1. На любой точке или копии базы сети выводим нужную кнопку на панель под определенным пользователем Кассы.&lt;br /&gt;
 &lt;br /&gt;
2. Заходим в таблицу USERS, находим пользователя под которым вывели кнопку и переходим в поле Data&lt;br /&gt;
&lt;br /&gt;
3. В поле Data должна быть выбрана вкладка AsText - ANSI. В Верху на панели нажимает кнопку с обозначением Дискетки - сохранить.&lt;br /&gt;
&lt;br /&gt;
4. В открывшемся окне выбираем нужную папку для сохранения, тип файла: Все файлы (*.*), набираем понятное имя файла и в конце обязательно добавляем &amp;quot;.ZIP&amp;quot;, запоминаем путь, нажимаем кнопку Cохранить.&lt;br /&gt;
&lt;br /&gt;
5. Переходим в каталог куда мы сохранили файл, находим его и распаковываем в папку и находим файл '''zkassa#user.ini'''. Открываем его на редактирование.&lt;br /&gt;
&lt;br /&gt;
6. Выполняем поиск по файлу раздела [UserToolBar] - это радел где хранятся кнопки выведенные на панель - находим по названию нужную кнопку нам в добавляем в начале строки '''zkassa#user.ini&amp;gt;UserToolBar&amp;gt;&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
7. Копируем строку в новый файл форма txt, сохраняем его на диске сервера синхронизации. В процедуре UTPR_MASTERDETAIL_KASSIR указываем путь к данному файлу&lt;br /&gt;
&lt;br /&gt;
Gif на тему:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Add_bitton1.gif]]&lt;br /&gt;
&lt;br /&gt;
 Отправляем исправления по синхронизации ночью!!! когда все АРМ Кассир закрыты. &lt;br /&gt;
&lt;br /&gt;
Для этого подготавливаем процедуру '''UTPR_MASTERDETAIL_KASSIR''' и планируем выполнение задания через ''Планировщик заданий Windows'' (команда taskschd.msc) ночью на запуск ТМС SpacePro которая будет вызывать нашу процедуру '''UTPR_MASTERDETAIL_KASSIR'''. Пример: ''D:\Standart-N\Standart-N\spacepro.exe +TMS=№_ТМС''&lt;br /&gt;
&lt;br /&gt;
Теги: отправить, кнопку, Blob, синхронизация, USERS, UTPR_MASTERDETAIL_KASSIR, панель, АРМ Кассир&lt;br /&gt;
&lt;br /&gt;
== Как обновить удаленно Distribute Client (dtclient) ==&lt;br /&gt;
Для обновления заходим на сервер синхронизации где установлен установлен каталог синхронизации sinhro. &lt;br /&gt;
&lt;br /&gt;
 Внимание!!! Порядок действий не меняем - очень важен для конечного результата&lt;br /&gt;
&lt;br /&gt;
1. Заходим в каталог shellupd, откидываем на всякий случай копию всех файлов в каталог back и копируем туда последнюю тестированную версию Distribute Client. &lt;br /&gt;
&lt;br /&gt;
2. Удаляем файл data.zip и создаем на основе exe Distribute Client с таким же названием в этом же каталоге.&lt;br /&gt;
&lt;br /&gt;
3. Смотрим версию Distribute Client.exe для этого открываем &amp;quot;Свойство&amp;quot; exe, вкладка &amp;quot;Подробно&amp;quot;, Версия файла - запоминаем. Нам нужна будет версия между первой точкой. &lt;br /&gt;
 Например в окне Версия файла мы видим строке 2.2045.0.0, нам будет нужна только 2.2045 &lt;br /&gt;
&lt;br /&gt;
4. Открываем файл exe.ver на редактирование и записываем новую версию файла, на текущем примере это 2.2045&lt;br /&gt;
&lt;br /&gt;
Кратко об этом gif:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Update_dtclient.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теги: обновить, Distribute Client, dtclient, синхронизация, DistributeClient&lt;br /&gt;
&lt;br /&gt;
=Частые ошибки=&lt;br /&gt;
==Column unknown==&lt;br /&gt;
Ошибка, возникающая на сервере. Означает, что у клиента в синхронизируемой таблице есть колонка, которой нет в этой таблице на серверной базе. Нужно либо добавить данную колонку на сервере, либо если она не нужна, или она есть не во всех клиентских базах, то добавить ее в список '''XFIELDS'''(xfields, xfields0, xfields1) в '''declare.php'''.&lt;br /&gt;
&lt;br /&gt;
==Violation of '''PRIMARY''' or UNIQUE KEY constraint==&lt;br /&gt;
Ошибка, возникающая когда на момент вставки записи в таблицу, в ней уже есть строчка с таким же d$uuid, но с другим сочетанием id и g$profile_id. Нужно либо перегенерировать d$uuid у той строчки, которая уже есть, либо удалить запись, у которой совпадают id и g$profile_id.&lt;br /&gt;
&lt;br /&gt;
==Foreign key... At trigger DOCS_TREB_BI==&lt;br /&gt;
Cначала попробуйте удалить старые накладные требования (сделав бэкап). &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
delete from doc_detail_active_treb ddat where ddat.insertdt &amp;lt;= current_date-7;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
delete from docs_treb dt where dt.insertdt &amp;lt;= current_date-7;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Проверьте в таблицы docs нет ли документов с rguid той записи, на которую ругается. Если такой документ уже есть, то измените ему rguid. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update docs d set d.rguid=replace(UUID_TO_CHAR( GEN_UUID()),'-','') where d.rguid=:rguid;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiple rows... PR_SETPARTREALQUANT... DOC_DETAIL_AI_WB==&lt;br /&gt;
Ошибка на сервере. Возможно в таблице warebase_g две строчки с part_id той записи, на которую ругается синхронизация. Удалите одну из них.&lt;br /&gt;
&lt;br /&gt;
==Querypackets2013 '''Не найдена запись'''==&lt;br /&gt;
Ошибка на клиенте, говорит о том, что на сервере в g$distribute запись есть, а в соответствующей таблице на сервере такой записи нет. Возможны два случая: &lt;br /&gt;
* Данную запись ктото случайно удалил. В этом случае нужно посмотреть на сервере с какого профиля она пришла (поле '''from_profile_id''' в g$distribute), подключиться к этой базе (также можно поискать в других сводных базах), найти эту запись, проапдейтить. В результате она должна придти на сервер и синхронизация снова пойдет. &lt;br /&gt;
* Данной записи нигде нет. Возможно она очень старая и поэтому ее удалили специально. Вопрос: почему наша база пытается ее скачать? Возможно в нашей базе сбилось поле serverpacket, точнее ктото неправильно почистил g$distribute, и теперь эта база пытается скачать вообще все с нуля. Надо проверить: это новая база? Нужно определить актуальность данных проблемной базы. Выполняем запрос на сервере: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select * from g$distribute where from_profile_id=:profile_id order by serverpacket desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Проверяем максимальное значение serverpacket в проблемной базе:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select max(g.serverpacket) from g$distribute g;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Оно должно быть меньше того что мы получили на сервере. Надо его заменить. Если в проблемной базе эта таблица вообще пустая, тогда берем запись с сервера и вставляем ее там. Затем снова запускаем синхронизацию.&lt;br /&gt;
удалить запись можно запросом :&lt;br /&gt;
&lt;br /&gt;
  delete from g$distribute g where g.soper &amp;lt;&amp;gt; 2 and g.tablename=Upper('имя таблицы') and&lt;br /&gt;
  not exists(select id from имя таблицы d where d.d$uuid = g.uuid)&lt;br /&gt;
Если просит удалить более 1000 записей, ток внедрению&lt;br /&gt;
&lt;br /&gt;
==Connection reset by peer==&lt;br /&gt;
* Проверить таймауты&lt;br /&gt;
* Проверить ограничения пакетов&lt;br /&gt;
* Выключить антивирус&lt;br /&gt;
* Выключить брэндмауэр&lt;br /&gt;
* Проверить системное время&lt;br /&gt;
* Выключить роутер '''на 15 минут'''&lt;br /&gt;
* Почистить таблицу g$distribute.&lt;br /&gt;
* в 80 % случаев не верный тип поля (пример DM_ID и DM_ID_NULL) на серверной базе предпочительно разрешать NULL значения&lt;br /&gt;
&lt;br /&gt;
==Incomplete Zip File==&lt;br /&gt;
Ошибка бывает на клиенте. &lt;br /&gt;
*Скорей всего связана с блокировками синхронизации антивирусом.&lt;br /&gt;
*Проверить правильность написания URL&lt;br /&gt;
&lt;br /&gt;
==wrong page type==&lt;br /&gt;
Ошибка wrong page type page 79332 is of wrong type (expected 7, found 5)...&lt;br /&gt;
падение базы. выполнить: mend -  backup - restore.&lt;br /&gt;
&lt;br /&gt;
==Ошибка при сеансе обмена:  checkprevtask: предыдущая задача не выполнена или выполнена с ошибкой==&lt;br /&gt;
в глоб базе в табл g$task по профилю есть задача, которая не выполнилась&lt;br /&gt;
по полю senddt  отправка прошла , а по полю enddt нет. т е задача не завершилась&lt;br /&gt;
в этом случае поле senddt устанавливаем в  NULL . синхронизируем. ждем завершения задачи&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update g$tasks g set g.senddt = null where g.senddt is not null and g.enddt is null and g.checkprevtask is not null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==conversion error from string ...At trigger 'GROUP_DETAIL_AD0_MMBSH' line: 9, col: 34==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решение данной ошибки нужно подправить два тригера&lt;br /&gt;
&amp;lt;pre&amp;gt;/* Trigger: GROUP_DETAIL_AD0_MMBSH */&lt;br /&gt;
CREATE OR ALTER TRIGGER GROUP_DETAIL_AD0_MMBSH FOR GROUP_DETAIL&lt;br /&gt;
ACTIVE AFTER DELETE POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  if (old.grouptable = 'PARTS.NAME_ID' ) then&lt;br /&gt;
   update warebase w set mmbsh = (select membership from PR_MEMBERSHIPS('PARTS=' || w.part_id || ';PARTS.NAME_ID=' || w.name_id || ';PARTS.IZG_ID=' || w.izg_id ||';',ascii_char(13)||ascii_char(10)))&lt;br /&gt;
   where name_id = old.grouptable_id;&lt;br /&gt;
&lt;br /&gt;
  if ((old.grouptable = 'PARTS' ) and (old.id&amp;gt;0))then&lt;br /&gt;
     update warebase w set mmbsh = (select membership from PR_MEMBERSHIPS('PARTS=' || w.part_id || ';PARTS.NAME_ID=' || w.name_id || ';PARTS.IZG_ID=' || w.izg_id ||';',ascii_char(13)||ascii_char(10)))&lt;br /&gt;
       where part_id = cast(old.grouptable_id as bigint);&lt;br /&gt;
end &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* Trigger: GROUP_DETAIL_BU0_MMBSH */&lt;br /&gt;
CREATE OR ALTER TRIGGER GROUP_DETAIL_BU0_MMBSH FOR GROUP_DETAIL&lt;br /&gt;
ACTIVE AFTER INSERT OR UPDATE POSITION 0&lt;br /&gt;
AS&lt;br /&gt;
begin&lt;br /&gt;
  if (new.grouptable = 'PARTS.NAME_ID' ) then&lt;br /&gt;
   update warebase w set mmbsh = (select membership from PR_MEMBERSHIPS('PARTS=' || w.part_id || ';PARTS.NAME_ID=' || w.name_id || ';PARTS.IZG_ID=' || w.izg_id ||';',ascii_char(13)||ascii_char(10)))&lt;br /&gt;
   where name_id = new.grouptable_id;&lt;br /&gt;
&lt;br /&gt;
  if ((new.grouptable = 'PARTS' ) and (new.id&amp;gt;0))then&lt;br /&gt;
   update warebase w set mmbsh = (select membership from PR_MEMBERSHIPS('PARTS=' || w.part_id || ';PARTS.NAME_ID=' || w.name_id || ';PARTS.IZG_ID=' || w.izg_id ||';',ascii_char(13)||ascii_char(10)))&lt;br /&gt;
   where part_id = new.grouptable_id;&lt;br /&gt;
end &amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Avo</name></author>	</entry>

	<entry>
		<id>http://wiki.standart-n.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_%D0%AD%D0%A1%D0%A4_%D0%90%D0%A0%D0%9C_%D0%A6%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BE%D1%84%D0%B8%D1%81_20210518.docx</id>
		<title>Файл:Инструкция ЭСФ АРМ Центральный офис 20210518.docx</title>
		<link rel="alternate" type="text/html" href="http://wiki.standart-n.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_%D0%AD%D0%A1%D0%A4_%D0%90%D0%A0%D0%9C_%D0%A6%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BE%D1%84%D0%B8%D1%81_20210518.docx"/>
				<updated>2021-05-18T08:30:54Z</updated>
		
		<summary type="html">&lt;p&gt;Avo: Avo загружена новая версия «Файл:Инструкция ЭСФ АРМ Центральный офис 20210518.docx»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Avo</name></author>	</entry>

	<entry>
		<id>http://wiki.standart-n.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_%D0%AD%D0%A1%D0%A4_%D0%90%D0%A0%D0%9C_%D0%A6%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BE%D1%84%D0%B8%D1%81_20210518.docx</id>
		<title>Файл:Инструкция ЭСФ АРМ Центральный офис 20210518.docx</title>
		<link rel="alternate" type="text/html" href="http://wiki.standart-n.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F_%D0%AD%D0%A1%D0%A4_%D0%90%D0%A0%D0%9C_%D0%A6%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BE%D1%84%D0%B8%D1%81_20210518.docx"/>
				<updated>2021-05-18T08:29:03Z</updated>
		
		<summary type="html">&lt;p&gt;Avo: Avo загружена новая версия «Файл:Инструкция ЭСФ АРМ Центральный офис 20210518.docx»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Avo</name></author>	</entry>

	<entry>
		<id><br />
<b>Fatal error</b>:  Call to a member function getUniqueId() on a non-object in <b>/var/web/wiki/includes/Feed.php</b> on line <b>395</b><br />
